【问题标题】:Activator.CreateInstance() - Constructor not foundActivator.CreateInstance() - 未找到构造函数
【发布时间】:2015-08-27 15:54:28
【问题描述】:

我有以下课程:

internal class MyQueryTranslator : ExpressionVisitor, IExpressionTranslator<QueryRequest>
{

       private IReflectionManager _reflectionManager;

       internal MyQueryTranslator(IReflectionManager reflectionManager)
       {
           this._reflectionManager = reflectionManager;
       }

       //....
}

同时,在另一个类中,我正在尝试使用Activator.CreateInstance() 方法实例化这个类:

internal class MyPersistenceStrategy<E> : IAsyncPersistenceStrategy<E>
     where E : class, IPersistableEntity
{

       private IReflectionManager _reflectionManager;
       private static readonly Dictionary<Type, Type> _translators;

       static MyPersistenceStrategy()
       {
             _translators = new Dictionary<Type, Type>()
             {
                  { typeof(QueryRequest), typeof(MyQueryTranslator) }
             }
       }

       private T TranslateExpression<T>(Expression expression)
       {
            if(_translators.ContainsKey(typeof(T))
                   throw new InvalidOperationException(String.Format("There is no translator for: {0}", typeof(T).Name);

            IExpressionTranslator<T> translator = 
                       (IExpressionTranslator<T>)Activator.CreateInstance(_translators[typeof(T)],
                                               BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
                                               null,
                                               _reflectionManager,
                                               null);

            return translator.Translate(expression);
       }

       //...

}

但是,我收到以下错误:

在 mscorlib.dll 中出现 System.MissingMethodException 类型的未处理异常
附加信息:未找到类型 XXXXX.MyQueryTranslator 的构造函数

如您所见,我传递了适当的BindingFlgs,因此可以实际找到构造函数。

TranslateExpression&lt;T&gt; 方法是这样调用的:

QueryRequest request = TranslateExpression<QueryRequest>(expression);

我还应该注意,这两个类都在同一个程序集中。

【问题讨论】:

  • 您提供的代码使用了CreateInstance 的重载,这......不存在。你的意思是new[] { _reflectionManager } 作为第四个参数吗?
  • @LucasTrzesniewski 我不敢相信就是这样!!重载确实存在,因为它编译正确。请张贴作为答案,所以我可以关闭这个问题
  • 很奇怪。显然它匹配了一些过载。在这种情况下它在做什么?
  • 啊,我敢打赌它匹配 CreateInstance(Type, params object[]) 重载。

标签: c# .net exception reflection system.reflection


【解决方案1】:

正如一些人指出的那样,它匹配了错误的重载。 参数必须是对象数组。

(IExpressionTranslator<T>)Activator.CreateInstance(_translators[typeof(T)],
                                           BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
                                           null,
                                           new object[] { _reflectionManager },
                                           null);

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多