类似于C#中的Cast int to enum,但我的枚举是Generic Type参数.处理这个问题的最佳方法是什么?
例:
private T ConvertEnum<T>(int i) where T : struct, IConvertible
{
return (T)i;
}
Run Code Online (Sandbox Code Playgroud)
生成编译器错误 Cannot convert type 'int' to 'T'
完整代码如下,其中value可以包含int或null.
private int? TryParseInt(string value)
{
var i = 0;
if (!int.TryParse(value, out i))
{
return null;
}
return i;
}
private T? TryParseEnum<T>(string value) where T : struct, IConvertible
{
var i = TryParseInt(value);
if (!i.HasValue)
{
return null;
}
return (T)i.Value;
}
Run Code Online (Sandbox Code Playgroud) 我有一个小方法,看起来像这样:
public void SetOptions<T>() where T : Enum
{
int i = 0;
foreach (T obj in Enum.GetValues(typeof(T)))
{
if (i == 0)
DefaultOption = new ListItem(obj.Description(), obj.ToString());
i++;
DropDownList.Items.Add(new ListItem(obj.Description(), obj.ToString()));
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我从枚举中填充下拉列表.Description()实际上是枚举的扩展方法,所以T绝对是一个enum.
但是,我想像obj你这样对任何枚举进行(int)obj转换,但是我得到一个错误,说我无法将T转换为int.有没有办法做到这一点?
我想使用 .NET Standard 实现以下方法:
public static void SetFlag<TEnum>(ref TEnum value, TEnum flag)
where TEnum : Enum
Run Code Online (Sandbox Code Playgroud)
我花了几个小时试图实现这一目标:
|对于像 s 这样的基本类型来说,通过反射获取运算符似乎是不可能的enum。dynamic需要引用额外的包 ( Microsoft.CSharp.RuntimeBinder),但我希望我的库保持纯粹的 .NET 标准符合。我最新的想法是手动比较 TEnum每个有效的枚举类型{byte , sbyte, short, ushort, int, uint, long, ulong}。但这感觉真的很奇怪而且肮脏:
try
{
var v = (byte)(object)value | (byte)(object)flag;
value = (TEnum)(object)v;
return;
}
catch (InvalidCastException) { }
try
{
var v = (int)(object)value | (int)(object)flag; …Run Code Online (Sandbox Code Playgroud)