在没有类约束的情况下将一个泛型转换为另一个泛型

| 我有以下代码:
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在代码中具有约束,否则我上面的强制转换将不起作用。我想使用值类型。有可能吗? 我不能使W和T具有相同的类型。我的接口没有全局关联的类型,只有内部数据类型。 这样一来,我可以拥有所有具有不同T \的列表     
已邀请:
        我能够找到一种方法,虽然有点棘手,但允许它工作:
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.
        }
    }
}
这样做的唯一缺点是,ѭ2use将使用转换器在内部对象之间切换,因此
string value = (string)Convert.ChangeType(1, typeof(string))
将起作用并返回
\"1\"
,而不是引发异常。 为了阐明其工作原理,文档中指出:   为使转换成功,值必须实现IConvertible接口,因为该方法只是将对一个合适的IConvertible方法的调用包装起来。该方法要求支持将值转换为conversionType。 因此,要使此方法与自定义类型一起使用,您将需要实现
IConvertible
接口才能从一种自定义类型转换为任何其他类型。在上面的代码示例中,如果
T
W
是相同类型,则即使自定义对象未实现
IConvertiable
Convert.ChangeType
也会成功。     
        动态关键字会帮助您吗? 像这样:
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...
       ...
    }
}
    

要回复问题请先登录注册