我有枚举,用Flags
属性标记。枚举包含客户选择的变体。在控制台窗口中,用户可以指向单个变体,也可以指向一组必需的变体(数字),以逗号分隔。我的方法解析客户选择,并将其转换为枚举(标志集)的值。
我也有一组类似的枚举。因此,我想对一组枚举使用相同的代码。我不想复制相同的代码,因此将其放入通用方法中:
private static T GetVariants<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum) {
throw new ArgumentException("'T' must be an enumerated type.");
}
Dictionary<int, T> dict = new Dictionary<int, T>();
// ...
T cs = dict[0];
// ...
cs |= dict[n]; // Here is CS0019 error.
}
我收到编译错误:
错误CS0019:运算符'| ='不能应用于类型'T'和'T'的操作数
我该如何解决?
使用Expression
一棵小树还不清楚您想要获得什么,但是:
public static class Or<T>
{
public static readonly Func<T, T, T> Do;
static Or()
{
var par1 = Expression.Parameter(typeof(T));
var par2 = Expression.Parameter(typeof(T));
Expression or;
if (typeof(T).IsEnum)
{
Type type = Enum.GetUnderlyingType(typeof(T));
or = Expression.Convert(
Expression.Or(
Expression.Convert(par1, type),
Expression.Convert(par2, type)),
typeof(T));
}
else
{
or = Expression.Or(par1, par2);
}
Do = Expression.Lambda<Func<T, T, T>>(or, par1, par2).Compile();
}
}
您可以使用如下代码:
[Flags]
public enum MyEnum
{
Val1 = 1,
Val2 = 2,
Val3 = 4,
}
public static T OrTogether<T>()
{
T ret = default(T);
foreach (T val in (T[])Enum.GetValues(typeof(T)))
{
ret = Or<T>.Do(ret, val);
}
return ret;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句