【问题标题】:Casting Enumerator type with reflection使用反射铸造枚举器类型
【发布时间】:2015-08-19 04:57:24
【问题描述】:

我正在尝试使用反射复制一个功能,但最终得到了

CreateFormatMethod.Invoke(typDbFormatClass, null)' 抛出类型为“System.Reflection.TargetInvocationException”对象 {System.Reflection.TargetInvocationException} 的异常

内部异常显示Object reference not set to an instance of an object. System.NullReferenceException

InnerException null

堆栈跟踪

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));

失败并显示 targetinvocationexception 的反射代码

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);

Type typDbDimension = CoreDatabaseAssembly.GetType("Binit.Core.Database.DbDimension");

Type typDoubleDimensClass = CoreDatabaseAssembly.GetType("Binit.Core.Database.DbDoubleDimension");
MethodInfo DbDoubleDimensionMethod = typDoubleDimensClass.GetMethod("GetDimension", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typDbDimension } , null);
object[] parametersDbDoubleDimen = new object[] { Enum.Parse(typDbDimension, dimension) };
object objDimension = DbDoubleDimensionMethod.Invoke(typDoubleDimensClass, parametersDbDoubleDimen);

我不确定如何通过反射对下面的 Enumerator 进行强制转换,我怀疑这是否会导致问题

(DbDimension)Enum.Parse(typeof(DbDimension), dimension)

object[] parametersDbDoubleDimen = new object[] { Enum.Parse(typDbDimension, dimension) };

dbFormat 类如下。

namespace Binit.Core.Database
{

public abstract class DbFormat
{
    protected static DbFormat m_internalDbFormat;

    protected DbFormat();

    public static DbFormat Create();

    public static DbFormat Create(DbFormat other);

}
}

【问题讨论】:

  • 你能发布完整的异常,包括堆栈跟踪和内部异常吗?
  • 看起来应该是object objDbFormat = createFormatMethod.Invoke(null, null);,因为它是一个没有参数的静态方法。
  • TargetInvocationException 表示空引用异常是从Create 内部抛出的。是否有一些你没有做的初始化?
  • 我想知道我是否必须做一个单独的初始化,因为我直接引用所做的就是调用 Binit.Core.Database.DbFormat.Create() 并且试图复制它有反射。
  • DbFormat.Create 是否使用app.config 来决定创建什么格式?

标签: c# reflection enumerator


【解决方案1】:

如果我正确理解您的意思,Binit.Core.Database.DbFormat 是一个嵌套类,带有一个静态方法 Create

如果是这样,那么这样做是不正确的:

createFormatMethod.Invoke(typDbFormatClass, null);

因为作为静态方法first parameter of Invoke should be null

但是,我不确定为什么会导致空异常,因为通常当我看到这样的东西时,是我的函数抛出异常(但是看起来你运行得很好,所以我不是当然...)

【讨论】:

  • 这个是对的,但是空引用是因为createFormatMethod——也就是找不到方法'Create'
  • 我尝试将其更改为对象 objDbFormat = createFormatMethod.Invoke(null, null);但是错误是一样的
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多