关于SO,这里有一些类似的问题,但似乎没有一个完全回答我的问题。
我想创建一个采用枚举类型并为UI生成ListItems列表的方法。像这样的签名可以工作:
public static List<ListItem> ListItemListFromEnum(Type t)
{
...
}
但是我不想接受任何类型(t必须是Enum类型)所以我可以做这样的事情:
public static List<ListItem> ListItemListFromEnum(Enum e)
{
Type t = e.GetType();
}
并将正确类型的枚举传递给方法。那会很好,但是我真的很想接受Type参数(如我的第一个示例中所示),但是将其强制为Enum类型。
这可能吗?有没有办法用泛型呢?谢谢
自C#7.3起,this is now possible:
public static List<ListItem> ListItemsListFromEnum<T>() where T:System.Enum
[T
将被限制为一个枚举。请注意,您必须使用类型Enum
,关键字enum
不会编译。
在以前的C#版本中,这是不可能的。
如果无法使用该版本的C#,则可以照原样接受Type
并检查IsEnum
属性。如果是,则抛出异常。
IsEnum
同样,您可以使用泛型:
public static List<ListItem> ListItemListFromEnum(Type t)
{
if (!t.IsEnum)
{
throw new ArgumentException("Type must be an enumeration", "t");
}
}
唯一的缺点是,您将获得运行时异常,而不是编译时异常。
您可以接受public static List<ListItem> ListItemListFromEnum<T>()
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("Type must be an enumeration", "t");
}
}
,如果该类型不是Type
类型,则抛出该错误。这可能是最好的方法(直到C#允许通用类型的占位符都受enum
约束,如果有的话)。
Enum
这是C#本身对许多public static List<ListItem> ListItemListFromEnum(Type t)
{
if (!t.IsEnum)
{
throw new ArgumentException("The type passed in must be an enum type.");
}
// ...
}
类的静态方法(例如Enum
)的作用。