2013-05-22 28 views
10

mam coś takiegoPrzechodząc rodzajem sposobu rodzajowego w czasie wykonywania

Type MyType = Type.GetType(FromSomewhereElse); 

var listS = context.GetList<MyType>().ToList(); 

chciałbym uzyskać typ, który jest MyType w tej sprawie i przekazać je do ogólnej metody Rodzaj GetList

jest to błąd otrzymuję:

typu lub obszaru nazwa „MyType” nie można odnaleźć (czy brakuje using dyrektywa lub odwołania do zestawu?)

+0

Musisz użyć odbicia. – gdoron

Odpowiedz

16

Można użyć refleksji i budować swoją rozmowę tak:

Type MyType = Type.GetType(FromSomewhereElse); 

var typeOfContext = context.GetType(); 

var method = typeOfContext.GetMethod("GetList"); 

var genericMethod = method.MakeGenericMethod(MyType); 

genericMethod.Invoke(context, null); 

Zauważ, że wywołanie metody z refleksji doda ogromną karę wydajności, spróbuj zmienić swoje rozwiązanie, jeśli to możliwe.

+0

'new [] {MyType}' może być po prostu 'MyType', ponieważ' MakeGenericMethod' akceptuje 'params'. – gdoron

+0

Dziękuję, mam zmodyfikowane rozwiązanie w celu uwzględnienia tego – Alexander

+1

Można obejść kary za wydajność przez ILEmitting dynamicznej metody. Oczywiście nadal dostajesz jednorazową karę, ale jest to sedno intensywnego użycia refleksji (jeśli masz dostęp do tej funkcji). –

-1

Nie budujesz generycznych dynamicznie, używając typu. Rodzaji są wypełniane nazwą klasy, a nie typem.

Można użyć Activator.CreateInstance, aby utworzyć typ ogólny. Będziesz musiał dynamicznie budować typ ogólny.

Aby utworzyć typ ogólny dynamicznie.

Type listFactoryType = typeof(GenericListFactory<>).MakeGenericType(elementType); 
var dynamicGeneric = (IListFactory)Activator.CreateInstance(listFactoryType); 

Zamiast otrzymywać listę za pomocą ogólnej metody, można utworzyć ogólną klasę, która udostępnia tę metodę. Możesz czerpać z takiego interfejsu.

interface IListFactory 
{ 
    IList GetList(); 
} 

class GenericListFactory<T> 
{ 
    public IList GetList() { return new List<T>(); } 
} 
3

Będziesz musiał użyć refleksji:

var method = context.GetType() 
    .GetMethod("GetList").MakeGenericMethod(MyType) 

IEnumerable result = (IEnumerable)method.Invoke(context, new object[0]); 
List<object> listS = result.Cast<object>().ToList(); 

Jednak nie ma sposobu, aby użyć instancji typu MyType jako zmienna typu statycznego, tak najlepiej można zrobić, to wpisać wyniki object.

Powiązane problemy