将约束类型传递给方法

Eri*_*rix 4 c# generics types .net-4.0

这里有几个类似的问题,但似乎没有一个问题能够完全回答我的问题.

我想创建一个采用Enum Type的方法,并为UI生成ListItem的List.像这样的签名的东西可以工作:

public static List<ListItem> ListItemListFromEnum(Type t)
{
    ...        
}
Run Code Online (Sandbox Code Playgroud)

但我宁愿不接受任何类型(t必须是Enum类型)所以我可以做这样的事情:

public static List<ListItem> ListItemListFromEnum(Enum e)
{
    Type t = e.GetType();
}
Run Code Online (Sandbox Code Playgroud)

并只是将正确类型的枚举传递给方法.这样可以正常工作,但我真的想要一个Type参数(如我的第一个例子),但强制它是一个Enum类型.

这可能吗?有没有办法用泛型做到这一点?谢谢

vcs*_*nes 6

如果你的意思是你想要制作这样的方法:

public static List<ListItem> ListItemsListFromEnum<T>() where T:Enum
Run Code Online (Sandbox Code Playgroud)

那么这在C#中是不可能的.然而,Jon Skeet整合了Unconstrained Melody,它增加了一些IL后期处理的功能.似乎C#编译器遵循这些约束,它只是不能声明它们.

也就是说,如果那不是您想要的,您可以按Type原样接受并检查IsEnum房产.如果是,请抛出异常.

public static List<ListItem> ListItemListFromEnum(Type t)
{
    if (!t.IsEnum)
    {
        throw new ArgumentException("Type must be an enumeration", "t");
    }     
}
Run Code Online (Sandbox Code Playgroud)

同样,您也可以使用泛型:

public static List<ListItem> ListItemListFromEnum<T>()
{
    if (!typeof(T).IsEnum)
    {
        throw new ArgumentException("Type must be an enumeration", "t");
    }     
}
Run Code Online (Sandbox Code Playgroud)

唯一不利的是,您将获得运行时异常而不是编译时异常.