2015-10-27 6 views
1

Я пытаюсь создать экземпляр FileHelperEngine <> с использованием универсального типа. Например, это работает СписокСоздать FileHelperEngine из переменной типа

public static IList CreateList(Type type) 
    { 
     var genericListType = typeof(List<>).MakeGenericType(type); 
     return (IList)Activator.CreateInstance(genericListType); 
    } 

Можно ли сделать что-то подобное для FileHelperEngine <>?

Я попытался

public static FileHelperEngine CreateFileHelperEngine(Type type) 
    { 
     var genericFileHelperEngineType = typeof (FileHelperEngine<>).MakeGenericType(type); 
     return (FileHelperEngine)Activator.CreateInstance(genericFileHelperEngineType); 
    } 

И получить эту ошибку

Невозможно привести объект типа 'FileHelpers.FileHelperEngine`1 [NachaParser.Model.EntryDetail.PpdEntryModel]' к типу 'FileHelpers.FileHelperEngine' ,

ответ

3

Это не сработает, потому что вы пытаетесь перейти от генератора к стандартному двигателю. Общий движок не наследуется от стандартного движка, поэтому вы не можете напрямую использовать его.

Следующий код должен работать для вас:

public static FileHelperEngine<T> CreateFileHelperEngine<T>() where T : class 
    { 
     var genericFileHelperEngineType = typeof(FileHelperEngine<>).MakeGenericType(typeof(T)); 
     return (FileHelperEngine<T>)Activator.CreateInstance(genericFileHelperEngineType); 
    } 

Проблема заключается в том, что вам нужно иметь тип T не в качестве переменной типа, но и как проходную общий аргумент. К сожалению, общий движок основан на EngineBase<T> с IFileHelperEngine<T> в качестве интерфейса, который он реализует, поэтому вы никогда не сможете получить FileHelperEngine<T> до FileHelperEngine.

Ваш только другой вариант заключается в использовании:

public static FileHelperEngine CreateFileHelperEngine(Type type) 
    { 
     if (!type.IsClass) 
      throw new InvalidCastException("Cannot use '" + type.FullName + "' as it is not a class"); 

     return new FileHelperEngine(type); 
    } 
+0

Вариант 2 работал, спасибо большое! – Bleeped