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 - 2025. All rights reserved.