我在这方面找到了很多类似的主题,但没有直接回答我的问题。我正在制作一个涉及放置不同类型房间的游戏。我有一个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)初始化,直到以后,这就是为什么成员是静态的,我正在尝试使用泛型。
答案 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}}并且适当地通用它。然后让您的卧室,浴室和什么继承房间。
如果您要添加新属性,这只是逻辑上的缺陷,因为您不能通用那些实际上不是通用的东西。