首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中将整数转换为泛型枚举

在C#中将整数转换为泛型枚举
EN

Stack Overflow用户
提问于 2012-05-01 00:26:46
回答 7查看 35.7K关注 0票数 101

类似于Cast int to enum in C#,但我的枚举是一个泛型类型参数。处理这个问题的最好方法是什么?

示例:

代码语言:javascript
复制
private T ConvertEnum<T>(int i) where T : struct, IConvertible
{
    return (T)i;
}

生成编译器错误Cannot convert type 'int' to 'T'

完整代码如下所示,value可以包含int,也可以包含null。

代码语言:javascript
复制
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;
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-05-01 00:30:18

我发现的最简单的方法是通过向object添加强制转换来强制编译器。

代码语言:javascript
复制
return (T)(object)i.Value;
票数 141
EN

Stack Overflow用户

发布于 2014-10-10 08:02:42

这里有一个非常快速的解决方案,它滥用了运行库创建静态泛型类的多个实例这一事实。释放你内心的优化心魔吧!

当你以一种通用的方式从一个流中读取枚举时,这真的很有用。结合外部类(也缓存枚举的底层类型)和BitConverter来释放令人敬畏的。

代码语言:javascript
复制
void Main() 
{
    Console.WriteLine("Cast (reference): {0}", (TestEnum)5);
    Console.WriteLine("EnumConverter: {0}", EnumConverter<TestEnum>.Convert(5));
    Console.WriteLine("Enum.ToObject: {0}", Enum.ToObject(typeof(TestEnum), 5));

    int iterations = 1000 * 1000 * 100;
    Measure(iterations, "Cast (reference)", () => { var t = (TestEnum)5; });
    Measure(iterations, "EnumConverter", () => EnumConverter<TestEnum>.Convert(5));
    Measure(iterations, "Enum.ToObject", () => Enum.ToObject(typeof(TestEnum), 5));
}

static class EnumConverter<TEnum> where TEnum : struct, IConvertible
{
    public static readonly Func<long, TEnum> Convert = GenerateConverter();

    static Func<long, TEnum> GenerateConverter()
    {
        var parameter = Expression.Parameter(typeof(long));
        var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
            Expression.Convert(parameter, typeof(TEnum)),
            parameter);
        return dynamicMethod.Compile();
    }
}

enum TestEnum 
{
    Value = 5
}

static void Measure(int repetitions, string what, Action action)
{
    action();

    var total = Stopwatch.StartNew();
    for (int i = 0; i < repetitions; i++)
    {
        action();
    }
    Console.WriteLine("{0}: {1}", what, total.Elapsed);
}

启用优化的酷睿i7-3740QM上的结果:

代码语言:javascript
复制
Cast (reference): Value
EnumConverter: Value
Enum.ToObject: Value
Cast (reference): 00:00:00.3175615
EnumConverter: 00:00:00.4335949
Enum.ToObject: 00:00:14.3396366
票数 18
EN

Stack Overflow用户

发布于 2018-06-21 16:22:14

或者,如果您不能将枚举作为泛型类型获取,而是作为type获取,则只需使用

代码语言:javascript
复制
Enum.ToObject

https://msdn.microsoft.com/en-us/library/system.enum.toobject(v=vs.110).aspx

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10387095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档