将约束类型传递给方法

问题描述 投票:4回答:2

关于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# generics types .net-4.0
2个回答
6
投票

自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");
    }     
}

唯一的缺点是,您将获得运行时异常,而不是编译时异常。


1
投票

您可以接受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)的作用。

© www.soinside.com 2019 - 2024. All rights reserved.