2

我发现了很多关于此的类似主题,但没有一个可以直接回答我的问题。我正在制作一个游戏,其中涉及放置不同类型的房间。我有一个 Room 类,然后是几个继承自该类的房间,例如 Bedroom、Canteen 等。

每个房间都有一定的静态参数来设置它的属性。例如:

public class Room : WorldEntity
{
    public static string Name = "Room";
    public static uint MinHeight = 0;
    public static uint MinWidth = 0;
    //...
}

public class Bedroom : Room
{
    new public static string Name = "Bedroom";
    new public static uint MinHeight = 4;
    new public static uint MinWidth = 4;  
     //...
}

创建房间时,我首先通过所需房间的类型,例如

public static void PlaceRoom(Type T){//begin room creation process}

我想知道的是,如何从我的 PlaceRoom 函数中获取 T 的属性?例如,如何获得 T.MinHeight(当 T 为 Bedroom 类型时将返回 4)?还是有更好的方法来解决这个问题?

直到稍后,我才打算初始化我的类 T(其中 T : Room),所以这就是为什么成员是静态的并且我正在尝试使用泛型。

4

3 回答 3

3

一种选择是创建一个IRoom接口,将这些值定义为属性。每个类都会实现这些属性并返回一个硬编码的结果。

另一种选择是创建一个或多个属性并将它们应用于您的类。该PlaceRoom函数将使用反射来读取属性。

于 2012-12-05T19:47:28.053 回答
1

首先,您创建了公共静态字段,这是非常糟糕的设计。公共静态字段应该是只读的。由于您不能将静态字段/属性设为虚拟,并且您不想在调用 PlaceRoom 之前创建实例,因此您可以使用属性来注释您的类型:

class Program
{
    static void Main(string[] args)
    {
        PlaceRoom<Room>();
        Console.ReadKey(true);
    }

    public static void PlaceRoom<T>()
        where T : Room
    {
        string name = ((NameAttribute)typeof(T).GetCustomAttributes(false).First(x => x is NameAttribute)).Name;

        Console.WriteLine(name);
    }
}

[Name("Room")]
public class Room
{
}

[Name("Bedroom")]
public class Bedroom : Room
{
}

[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class NameAttribute : Attribute
{
    public string Name { get; set; }

    public NameAttribute(string name)
    {
        Name = name;
    }
}
于 2012-12-05T21:11:21.573 回答
0

如果您总是覆盖(或新建)属性并且从未实际放置实际Room类型,则可以将 Room 及其所有属性都设为抽象,然后让您的方法签名成为public static void PlaceRoom<T>(T room) where T : Room并对其进行适当的通用化。然后让你的 Bedroom、Bathroom 和其他东西从 Room 继承。

如果您要添加新属性,这在逻辑上是有缺陷的,因为您不能对实际上不是通用的事物进行通用。

于 2012-12-05T20:17:10.760 回答