C#访问T的静态成员

时间:2012-12-05 19:43:25

标签: c# generics

我在这方面找到了很多类似的主题,但没有直接回答我的问题。我正在制作一个涉及放置不同类型房间的游戏。我有一个Room课程,然后是几个继承了这个课程的房间,例如:卧室,食堂等。

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

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为类型卧室时将返回4)?或者有更好的方法来解决这个问题吗?

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

3 个答案:

答案 0 :(得分:3)

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

另一种选择是创建一个或多个attributes并将其应用于您的课程。 PlaceRoom函数将使用反射来读取属性。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

如果你总是覆盖(或新增)属性而从不实际放置实际的Room类型,你可以将Room及其所有属性都抽象化,然后让你的方法签名为{{ 1}}并且适当地通用它。然后让您的卧室,浴室和什么继承房间。

如果您要添加新属性,这只是逻辑上的缺陷,因为您不能通用那些实际上不是通用的东西。