Activator.CreateInstance() - 找不到构造函数

本文关键字:找不到 构造函数 CreateInstance Activator | 更新日期: 2023-09-27 17:55:19

我有以下类:

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 中发生了 System.MissingMethodException 类型的未处理异常.dll
其他信息:找不到类型 XXXXX.MyQueryTranslator 的构造函数

如您所见,我正在传递适当的BindingFlgs,以便实际找到构造函数。

TranslateExpression<T>方法的调用方式如下:

QueryRequest request = TranslateExpression<QueryRequest>(expression);

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

Activator.CreateInstance() - 找不到构造函数

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

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