有人能解释一下为什么将动态对象转换为类会返回该类,而使用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()的结果赋值回目标IEnumerable时,此时我会遇到运行时错误,说类型对象不能转换为某个具体类,即使未装箱的对象类型与所需类型匹配。如果我尝试像上面的dTest2中的类似语法,运行时仍然无法找到"转换"。我意识到这可能是对dynamic的滥用和糟糕的编程实践。如果我能找到另一种解决方案,我肯定会使用它,但现在我要么需要让它工作,要么选择更少野心的方案。