问题描述
|
我有以下代码:
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...
...
}
}