将约束类型传递给方法
本文关键字:方法 约束 类型 | 更新日期: 2023-09-27 18:12:22
在SO上有一些类似的问题,但似乎没有一个能完全回答我的问题。
我想创建一个方法,它接受Enum类型,并为UI生成一个列表项列表。像这样的签名可以工作:
public static List<ListItem> ListItemListFromEnum(Type t)
{
...
}
但是我宁愿不接受任何类型(t必须是Enum类型)我可以这样写:
public static List<ListItem> ListItemListFromEnum(Enum e)
{
Type t = e.GetType();
}
,并将正确类型的enum传递给方法。这将工作得很好,但我真的想要一个类型参数(如我的第一个例子),但强制它是一个Enum类型。
这可能吗?是否有一种方法可以用泛型做到这一点?由于
从c# 7.3开始,现在可以这样做了:
public static List<ListItem> ListItemsListFromEnum<T>() where T:System.Enum
和T
将被约束为enum。注意必须使用Enum
类型,关键字enum
将无法编译。
在以前的c#版本中,这是不可能的。
如果您不能使用该版本的c#,您可以接受Type
,并检查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
,然后抛出如果该类型不是enum
类型。这可能是最好的方法(直到c#允许通用类型占位符受Enum
约束,如果有的话)。
public static List<ListItem> ListItemListFromEnum(Type t)
{
if (!t.IsEnum)
{
throw new ArgumentException("The type passed in must be an enum type.");
}
// ...
}
这就是c#本身对许多Enum
类的静态方法(如Enum.GetEnumNames()
)所做的。