2017-02-15 1 views
1

Есть небольшая возможность, я мог бы неправильно сформулировать заголовок и извиниться, если это встречается, как уже ответил (и у меня просто нет нашел его).Как использовать тип Type.GetType(), чтобы передать неизвестный тип во время выполнения в общий метод

Сказав, что я искал этот сайт в течение нескольких часов и столкнулся с несколькими очень сложными попытками (недостаточно ясными) использования отражения, которые я не хочу использовать из-за соображений производительности. Я уже использую Type.GetType(), который ищет через .dll, чтобы найти тип.

Итак, без дальнейших церемоний, здесь идет ..

У меня есть метод в классе, который принимает обобщенный тип:

public class SomeClass 
{ 
    public TList Execute<TList, TItem>(string text) 
     where TList : ICollection<TItem>, new() 
     where TItem : new() 
    { 
     TList list = new TList(); 
     TItem item = new TItem(); 
     ...set properties and add to list... 
     ...implementation not important... 
     return list; 
    } 
} 

использования (вызова метода):

public void callingMethod(string typeNameString, string typeItemNameString) 
{ 
    Type T = Type.GetType(typeNameString); 
    Type Ti = Type.GetType(typeItemNameString); 

    SomeClass sc = new SomeClass(); 

    // and here is where things falls apart drastically.. 
    // not sure exactly what to do here as it seems noting works 
    var result = sc.Execute<T,Ti>("hello text"); //no luck..'T' is a variable but used as a type 
    var result = sc.Execute<Type.GetType(typeNameString),Ti>("hello text"); //no luck...operator '<' cannot be appliedto operands of type 'method group' and 'Type' 

    //This works fine 
    List<Invoice> _invoices = sc.Execute<Invoices, Invoice>("hello text"); 
} 

public class Invoice 
{ //properties omitted } 

public class Invoices : List<Invoice> 
{} 

Это похоже на очень прямолинейный/логический подход, но это не так.

Что мне не хватает?

Я ценю время и целеустремленность, которые люди берут, чтобы ответить на вопросы на этом форуме.

ответ

1

Вы не можете использовать нотацию <>, потому что компилятор действительно создает класс с встроенным типом. Следовательно, он должен быть известен во время компиляции. Для того, что вы пытаетесь сделать, вы должны использовать отражение.

Смежные вопросы