2015-06-11 3 views
2

У меня есть следующий класс:Activator.CreateInstance() - Конструктор не найден

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

     //... 

} 

Однако , Я получаю следующую ошибку:

An unhandled exception of type System.MissingMethodException occured in mscorlib.dll
Additional information: Constructor on type XXXXX.MyQueryTranslator not found

Как вы можете видеть, я прохожу соответствующий BindingFlgs, поэтому конструктор можно найти.

TranslateExpression<T> метод вызывается так:

QueryRequest request = TranslateExpression<QueryRequest>(expression); 

Следует также отметить, что оба класса находятся в одной и той же сборки.

+3

Код, который вы указали, использует перегрузку «CreateInstance», которая не существует. вы имели в виду «new [] {_reflectionManager}' как 4-й параметр? –

+0

@LucasTrzesniewski Я не могу поверить, что это было! Перегрузка фактически существует, потому что она скомпилирована правильно. Пожалуйста, напишите как ответ, поэтому я могу закрыть этот вопрос. –

+0

Странно. Очевидно, что это соответствует некоторой перегрузке. Что он делает в этом случае? – Tim

ответ

0

Как некоторые указали, что это соответствует неправильной перегрузке. Параметры должны быть массивом объектов.

(IExpressionTranslator<T>)Activator.CreateInstance(_translators[typeof(T)], 
              BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, 
              null, 
              new object[] { _reflectionManager }, 
              null); 
Смежные вопросы