将约束类型传递给方法

本文关键字:方法 约束 类型 | 更新日期: 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())所做的。