Próbuję utworzyć Delegata do odczytu/zapisu właściwości nieznanego typu klasy w czasie wykonywania.CreateDelegate przy nieznanych typach
mam rodzajowe klasy Main<T>
oraz metodę, która wygląda tak:
Delegate.CreateDelegate(typeof(Func<T, object>), get)
gdzie get
jest MethodInfo
nieruchomości, które należy przeczytać. Problem polega na tym, że gdy właściwość zwraca int
(domyślam się, że dzieje się to w przypadku typów wartości), powyższy kod generuje ArgumentException, ponieważ metoda nie może być powiązana. W przypadku sznurka działa dobrze.
Aby rozwiązać problem, zmieniłem kod tak, aby odpowiedni typ Delegata był generowany przy użyciu MakeGenericType
. Więc teraz kod jest:
Type func = typeof(Func<,>);
Type generic = func.MakeGenericType(typeof(T), get.ReturnType);
var result = Delegate.CreateDelegate(generic, get)
Problem jest teraz, że stworzony przykład delegat generic
więc muszę używać DynamicInvoke
, który byłby tak wolno, jak przy użyciu czystego odbicia do zapoznania się z boiska.
Moje pytanie brzmi: dlaczego pierwszy fragment kodu zawodzi z typami wartości. Według MSDN powinno działać jak mówi, że
Rodzaj powrót delegata jest zgodny z typem zwracanej przez metodę, jeśli typ zwracany tej metody jest bardziej restrykcyjne niż zwracany typ delegata
i jak wykonać delegata w drugim fragmencie, aby był szybszy od odbicia.
Dzięki.
Dziękuję bardzo, zadziałało! – Giorgi