【发布时间】:2014-01-31 06:07:43
【问题描述】:
有人可以解释为什么将动态对象转换为类会返回该类,而使用 Convert.ChangeType 会返回动态对象,尤其是在运行时?例如:
dynamic dObject = new SomeClass();
var dTest1 = dObject as SomeClass; // returns SomeClass
var dTest2 = Convert.ChangeType(dObject, typeof(SomeClass)); // returns dynamic
更广泛的问题:我有一系列实现通用接口的辅助类。我需要将这些类的列表传递给其他对象;但是不同的辅助类对泛型参数使用不同的类型,所以我不能直接传递辅助类的列表:
interface IHelper<T>
{
IEnumerable<T> Foo();
}
var HelperList = new List<IHelper<T>> // Can't do this because T varies from helper to helper!
所以我想我可以通过创建一个包含辅助类和泛型类型的容器类来伪造运行时,但会利用动态:
class ContainerClass
{
IHelper<dynamic> HelperClass;
Type dType; // Specifies the type for the dynamic object
}
现在我可以创建并传递一个 ContainerClass 列表。所有处理都很好,直到我需要将 Foo() 的结果分配回目标 IEnumerables,此时我收到运行时错误,指出类型对象无法转换为某某具体类,即使未装箱的对象类型匹配那些需要的。如果我尝试与上面 dTest2 中类似的语法,运行时仍然无法找出“转换”。
我意识到这可能是对动态和糟糕的编程实践的滥用。如果我能确定一个解决方案,我肯定会使用不同的解决方案,但现在我要么需要完成这项工作,要么选择不那么雄心勃勃的东西。
【问题讨论】:
标签: c# generics dynamic casting type-conversion