强制C#转换为通用

时间:2017-08-31 16:31:26

标签: c# generics types casting

我正在修改一个工具,因为我希望能够使用泛型类型。 它具有“AsDouble”,“AsBool”等属性

我想强制进行类型转换,我不在乎它是否会在运行时抛出。我只想要它编译。<​​/ p>

所以......这不会编译......

public T As<T>()
{
    Type type = typeof(T);
    if (type == typeof(Double))
    {
        return (T)(AsDouble);
    }
    // more conditionals
}

然而这确实......

public T As<T>()
{
    Type type = typeof(T);
    if (type == typeof(Double))
    {
        return (T)(AsDouble as object);
    }
    // more conditionals
}

为什么会这样?我如何让它停止抱怨,并按我的要求去做?或者,有什么比我想到的更好的方式吗?

//不重复建议的那个。 (Type1)Type2不起作用......我想知道为什么从T1转换到T2到T3工作但不是T1到T3。 (T1为双,T2为对象,T3为通用类型。)请在将其标记为重复之前阅读我的问题。

1 个答案:

答案 0 :(得分:4)

如果T没有任何类型约束,编译器将不知道要执行什么类型的转换,因为Tdouble之间的关系未知。我知道实现你想要的唯一方法是转换对象,这可能会生成一个box / unbox操作(它可能会得到优化,但我不确定)。

对于按类型I具有明确特化的通用方法,我采用了以下模式:

class Owner
{
    class  AsHelper<T>
    {
        public static Func<Owner, T> As;
    }

    static Owner()
    {
        AsHelper<double>.As = _ => _.AsDouble;
        // Other implementations
    }
    public T As<T>() where T: struct
    {
        if(AsHelper<T>.As != null)
        {
            return AsHelper<T>.As(this);
        }
        else
        {
            // Default implementation or exception
            return default(T);
        }
    }
}

这使专业化保持在他们自己的方法中。从我的性能测试来看,它与if基本方法大致相同。由于静态是.NET中的泛型类实例化,而不是每个泛型类定义,As的{​​{1}}字段对于每个AsHelper<T>具有不同的值