【问题标题】:Force C# Cast To Generic强制 C# 转换为泛型
【发布时间】:2017-08-31 16:31:26
【问题描述】:

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

我想强制进行类型转换,我不在乎它是否会在运行时抛出。我只是想让它编译。

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

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 是泛型类型。)请在将其标记为重复之前阅读我的问题。

【问题讨论】:

  • AsDouble 是复杂类型吗?
  • Generic Casting的可能重复
  • 不,AsDouble 是一个将变量作为“double”返回的属性。它只是尝试转换和 TryParse。
  • System.IConvertible 已经存在,你为什么要这样做?
  • System.IConvertible 要求我实现 15 种不同的方法。我不需要那么多。这也会令人困惑。

标签: c# generics types casting


【解决方案1】:

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

对于具有明确专业化类型的泛型方法,我采用了以下模式:

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 中的每个泛型类实例化而不是每个泛型类定义,AsHelper&lt;T&gt;As 字段对于每个 T 将具有不同的值

【讨论】:

  • 我已经读了好几遍了;现在我明白你在说什么了。这真太了不起了!我以前从未想过这样的事情;非常感谢!
  • 很高兴你的帮助:)
猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
相关资源
最近更新 更多