将一个泛型转换为另一个,没有类约束

时间:2011-06-13 15:37:31

标签: c# .net generics constraints

我有以下代码:

public interface IDrilldown
{
   void AddCriteria<T>(T Criterion);
}

public class MyClass<W> : IDrilldown // where W : class
{
    void IDrilldown.AddCriteria<T>(T Criterion)
    {
       W value = Criterion as W;
       ...
    }
}

不幸的是,除非W在代码中有constaint,否则我上面的演员都不会工作。我想使用值类型。它有可能吗?

我不能使W和T成为同一类型。我的界面没有全局关联的类型,只有内部数据类型。

这样我就可以让一个列表具有不同的T

2 个答案:

答案 0 :(得分:2)

我能够找到一种方法来做到这一点,它有点hacky但允许它工作:

class MyClass<W> : IDrilldown {
    void IDrilldown.AddCriteria<T>(T Criterion) {
        if (Criterion is W) {
            W value = (W)Convert.ChangeType(Criterion, typeof(W));
            // value is W, have fun
            // or - as Snowbear pointed out in the comments
            W value = (W)(object)Criterion;
            // works just as well....
        } else {
            // value is NOT W and could not be converted.
        }
    }
}

唯一的缺点是,Convert.ChangeType将使用转换器在内部对象之间进行更改,因此string value = (string)Convert.ChangeType(1, typeof(string))将起作用并返回"1"而不是抛出异常。

为澄清其工作原理,文档说明:

  

要使转换成功, 值必须实现IConvertible接口 ,因为该方法只是将调用包装到适当的IConvertible方法。该方法要求支持将值转换为conversionType。

因此,要使用此方法使用自定义类型,您需要实现IConvertible接口以将一种自定义类型转换为任何其他类型。在上面的代码示例中,如果 TW属于同一类型,Convert.ChangeType将成功,即使自定义对象未实现{{ 1}}。

答案 1 :(得分:2)

动态关键字会帮助你吗?

这样的事情:

public interface IDrilldown
{
   void AddCriteria<T>(T Criterion);
}

public class MyClass : IDrilldown
{
    void IDrilldown.AddCriteria<T>(T criterion)
    {
       dynamic value = criterion;
       // can use typeof() to figure out type if needed...
       ...
    }
}