C# 泛型可空枚举
我希望有一个方法可以从一个可为空的数据库列解析一个枚举。 我在下面编写了这个方法(必须将T限制为一个struct才能编译) 它确实可以编译,但我认为这是错误的,因为枚举不是结构? 如果是这样,我如何限制泛型方法说我需要一个ValueType?您不必向我抱怨“只有不可为null的值类型才能作为'System.nullable'的基础”C# 泛型可空枚举,c#,generics,enums,nullable,C#,Generics,Enums,Nullable,我希望有一个方法可以从一个可为空的数据库列解析一个枚举。 我在下面编写了这个方法(必须将T限制为一个struct才能编译) 它确实可以编译,但我认为这是错误的,因为枚举不是结构? 如果是这样,我如何限制泛型方法说我需要一个ValueType?您不必向我抱怨“只有不可为null的值类型才能作为'System.nullable'的基础” private static T? ParseEnum<T>(DataRow row, string columnName) where T :
private static T? ParseEnum<T>(DataRow row, string columnName)
where T : struct
{
T? value = null;
try
{
if (row[columnName] != DBNull.Value)
{
value = (T)Enum.Parse(
typeof(T),
row[columnName].ToString(),
true);
}
}
catch (ArgumentException) { }
return value;
}
private static T?ParseEnum(数据行,字符串列名)
其中T:struct
{
T?值=空;
尝试
{
if(行[columnName]!=DBNull.Value)
{
value=(T)Enum.Parse(
类型(T),
行[columnName].ToString(),
正确的);
}
}
捕获(参数异常){}
返回值;
}
不幸的是,C语言中没有可用的约束,允许您限制给定类型是枚举。但是在IL中有这样的概念。Jon。我认为您可以尝试在运行时使用dynamic并创建枚举的通用列表
public static dynamic ToValues(this Type enumType)
{
var values = Enum.GetValues(enumType);
Type list = typeof(List<>);
Type resultType = list.MakeGenericType(enumType);
dynamic result = Activator.CreateInstance(resultType);
foreach (var value in values)
{
dynamic concreteValue = Enum.Parse(enumType, value.ToString());
result.Add(concreteValue);
}
return result;
}
公共静态动态值(此类型枚举类型)
{
var values=Enum.GetValues(enumType);
类型列表=类型(列表);
类型resultType=list.MakeGenericType(enumType);
动态结果=Activator.CreateInstance(resultType);
foreach(值中的var值)
{
dynamic concreteValue=Enum.Parse(enumType,value.ToString());
结果.增加(具体价值);
}
返回结果;
}
因此,您将有一个具体的枚举列表枚举只是在顶部加了sugar的整数,所以它们实际上是结构,而且枚举实际上也是structs@Artiomenum实际上是一个类!