2009-09-21 11 views
8

Mam pytanie dotyczące wywoływania ogólnej metody klasy z parametrem typu znanym w czasie wykonywania.Wywołanie funkcji ogólnej z parametrem typu określonym w czasie wykonywania

W specyficzny kod wygląda tak:


FieldInfo[] dataFields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); 

// data is just a byte array used internally in DataStream 
DataStream ds = new DataStream(data); 

foreach (FieldInfo field in dataFields) 
{ 
    Type fieldType = field.FieldType; 

    // I want to call this method and pass in the type parameter specified by the field's type 
    object objData = (object) ds.Read<fieldType>(); 
} 

Funkcja read() wygląda tak: Celem


public T Read() where T : struct 

ta funkcja jest przywrócenie danych odczytanych z tablicy bajtów.

Czy istnieje jakiś sposób wywołania metody ogólnej w czasie wykonywania w ten sposób?

Odpowiedz

12

Najprostszym sposobem radzenia sobie z tym byłoby dokonać nierodzajową przeciążenie funkcji odczytuje się z jednego parametru Typ:

public object Read(Type t) 

A potem mają generycznych wersji zadzwonić wersję non-generic:

public T Read<T>() where T : struct 
{ 
    return (T)Read(typeof(T)) 
} 
+0

Dzięki za odpowiedź, nigdy nie brałem pod uwagę tak prostej zmiany projektu. –

+0

Mój problem nie wyglądał tak jak pytanie OP, ale pokazałeś dokładnie to, co powinienem wiedzieć. Dzięki! – KennyZ

7

Musisz zbudować MethodInfo i wywołać metodę odczytu:

MethodInfo method = typeof(DataStream).GetMethod("Read"); 
MethodInfo generic = method.MakeGenericMethod(fieldType); 
object objData = generic.Invoke(ds, null); 
+0

Jeszcze raz dziękuję Reed, twoja pomoc jest bardzo doceniana. –

1

Prawdopodobnie lepiej pójść trasą Lee. Ogólne są skrócone w czasie projektowania, aby uniemożliwić pisanie wspólnego kodu dla wielu różnych typów klas. W czasie kompilacji każde wywołanie generycznej metody lub klasy generowane jest w zasadzie jako zupełnie odrębna klasa.

Znacznie łatwiej jest po prostu poddać basowemu typowi i użyć odbicia, co i tak trzeba by było zrobić.

+0

To prawda, że ​​metoda Lee byłaby również lepsza pod względem wydajności, ponieważ dodatkowe odbicie w celu pobrania MethodInfo byłoby dodatkowym obliczeniem, którego można by uniknąć za pomocą jego metody. –

Powiązane problemy