MethodInfo.Invoke(未将对象引用设置为对象的实例。)在抽象类中调用静态方法

问题描述 投票:0回答:1

我试图通过反射复制功能,但最终得到

createFormatMethod.Invoke(typDbFormatClass, null)'抛出了类型为'System.Reflection.TargetInvocationException'对象{System.Reflection.TargetInitationException}的异常

内部异常显示

Object reference not set to an instance of an object.
系统.NullReferenceException

内部异常为空

堆栈跟踪

at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[]   arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at AB.INIT.stringToValue(String valueInUnits, String dimension, String sourceUnit, String destinationUnit)

我试图在这里访问抽象类的静态方法。下面是完美运行的直接参考代码。

Binit.Core.Database.DbFormat format;
format = Binit.Core.Database.DbFormat.Create();
format.Dimension = DbDoubleDimension.GetDimension(
                   (DbDimension)Enum.Parse(typeof(DbDimension), dimension));
format.Units = DbDoubleUnits.GetUnits(
                (DbUnits)Enum.Parse(typeof(DbUnits), destinationUnit));

反射代码失败并显示目标调用异常

Assembly CoreDatabaseAssembly = 
         Assembly.LoadFrom(Path.Combine(APath, @"Binit.Core.Database.dll"));

Type typDbFormatClass = CoreDatabaseAssembly.GetType("Binit.Core.Database.DbFormat");

MethodInfo createFormatMethod = typDbFormatClass.GetMethod("Create", 
           BindingFlags.Static | BindingFlags.Public, null, new Type[] { }, null);

object objDbFormat = createFormatMethod.Invoke(typDbFormatClass, null);

有人可以帮我理解调用方法可能做错了什么吗

c# reflection abstract
1个回答
0
投票

这是我在您的代码中看到的第一个错误:

您将

typDbFormatClass
作为第一个参数传递给
createFormatMethod.Invoke
。但这个
Invoke
方法是
System.Reflection.MethodInfo.Invoke
。此方法接受
null
或某个对象引用作为第一个参数。这取决于
MethodInfo
createFormatMethod
对应的方法。如果这是一个
static
方法,则
Invoke
需要
null
,否则您需要传递具有您正在调用的方法的类型的实例。

如果您引用

typDbFormatClass
null
,就会出现问题。但我们假设它不是
null
。但问题是这个对象
typDbFormatClass
是完全不相关的。这不是您类型的实例,但您传递的是
System.Type
的实例。不管怎样,即使不跑步,你也很明显做错了。

您需要从一开始就重构代码以消除此错误。如果不这样做,进一步的调查就没有意义。

© www.soinside.com 2019 - 2024. All rights reserved.