Próbuję ulepszyć mój kod refleksji, tworząc opcję Delegatów dla metod Getter
i Setter
.Przesyłanie uczestnika do działania <T> lub Func <T> w środowisku wykonawczym
Mój kod wygląda następująco:
MyObject obj = new MyObject();
var prop = obj.GetType().GetProperty("Prop");
var getType = typeof(Func<>).MakeGenericType(prop.PropertyType);
var setType = typeof(Action<>).MakeGenericType(prop.PropertyType);
var getMethod = prop.GetGetMethod().CreateDelegate(getType, obj);
var setMethod = prop.GetSetMethod().CreateDelegate(setType, obj);
// I'd like to change this section and not to use a dynamic!!
dynamic castedGet = Convert.ChangeType(getMethod, getType);
dynamic castedSet = Convert.ChangeType(setMethod, setType);
CreateDelegate
zwraca Delegate
i korzystania DynamicInvoke
nie jest wydajność mądry.
Przerzuciłem (na stałe) Delegate
do Action<T> \ Func<T>
i zobaczyłem ogromny wzrost mojej wydajności.
Potem próbował rzucić Delegate
do Action<T> \ Func<T>
w czasie pracy (przy użyciu Convert.ChangeType
i dynamic
) i mój występ został ranny - prawdopodobnie ze względu na fakt, że używam typ dynamic
.
Jestem prawie pewny, że mogę to zrobić bez dynamic
.
Chyba rozwiązanie ma coś wspólnego z expression trees
, ale nie jestem pewien, jak kod coś takiego. Jeśli ktoś ma dobre rozwiązanie, które nie korzysta z numeru expression trees
, to również interesujące będzie usłyszeć o nim.
Czy wykonujesz cały ten kod * co * raz, czy też buforujesz gdzieś delegatów, a następnie je wywołujesz? – Dai
@Dai - To jest mała część mojego kodu i rodzaj próbki. Czekam na buforowanie właściwości, gettera, setera dla każdej własności - w leniwy sposób. –
Dlaczego mimo to używasz 'dynamic'? 'Convert.ChangeType' nie zwraca obiektu związanego z opóźnieniem. – Dai