我有以下代码:
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
答案 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
接口以将一种自定义类型转换为任何其他类型。在上面的代码示例中,如果 T
和W
属于同一类型,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...
...
}
}