动态对象强制转换为仅在运行时已知的类型

时间:2013-10-05 17:16:20

标签: c#

情况:      键入baseType仅在运行时知道。      objectInstance是baseType类型的子类      objectInstance是从对动态方法的调用中检索的

必填:

Type baseType = ...; // obtained at runtime
var baseDynamicInstance = (basetype) objectInstance; // or reflection cast

当硬编码时,它可以正常工作

   var oi = (PartnerBase) objectInstance;   // this works

尝试:

public object CastPocoInstance(Type targetType, object objectInstance) {
    MethodInfo castMethod = objectInstance.GetType().GetMethod("Cast").MakeGenericMethod(targetType); // <<< NULL REF here
    object castedObject = castMethod.Invoke(null, new object[] { objectInstance });
    return castedObject;
   }

错误:     null object ref错误。
    在即时窗口中,我看到objectInstance.GetType()。GetMethod(“Cast”)返回null
    objectInstance.GetType.GetMethods()//在即时窗口中显示一个列表。                                             //没有显示演员方法

我看了很多例子 那对我来说,Type.GetMethod(“演员”)是正确的。 但它不起作用。显然我做错了。

任何提示

编辑: 没有向下转换为基础硬编码的调用错误

  

[Microsoft.CSharp.RuntimeBinder.RuntimeBinderException] = {“最好的   重载方法匹配   'P42.RepositoryBase.GetEntityState(P42.Core.PartnerBase)'   有一些无效的参数“}

EDIT2: 从动态方法调用中检索ObjectInstance。 该对象应该用于调用动态方法。 如果我硬编码下来就可以了。 var x =(baseobject)ObjInstance 并使用x调用动态方法。它有效。

基本类型也仅在运行时已知。 有没有办法将SpecificObject动态地转换为BAseObject?

1 个答案:

答案 0 :(得分:4)

转换为仅在运行时已知的类型对于编译器来说似乎是一种无意义的操作:因为根据定义,它在运行时之前不知道类型,因此没有编译时支持它所以这样做没有任何好处。如果通过Reflection使用对象,那么保存实例的变量的实际类型并不重要 - 可能也是Object

这并不意味着它不可能,演员表演有点麻烦。该语言允许我们使用类型参数化类型编写仅在运行时知道给定类型的代码!

我的示例中的代码使用在运行时专门找到的信息设置了一个非常简单的方法来获取AdapterDelegate的{​​{1}}。您会注意到LibraryDelegate<TRunTimeType>方法中的TRunTimeType实际投射。查看AdapterDelegateHelper.Adapter<TRuntimeType>.adapter代码,了解这是多么容易使用:

Main