Sto cercando di migliorare il mio codice di riflessione creando delegati per i metodi Getter
e Setter
.Trasferimento di un delegato in un'azione <T> o Func <T> in runtime
Il mio codice è simile al seguente:
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
restituisce un Delegate
e utilizzando DynamicInvoke
non è prestazioni saggio.
Ho fuso (codificato) lo Delegate
in Action<T> \ Func<T>
e ho visto un enorme aumento delle mie prestazioni.
Allora ho provato a gettare il Delegate
in Action<T> \ Func<T>
in fase di esecuzione (utilizzando Convert.ChangeType
e dynamic
) e la mia prestazione è fatto male - probabilmente a causa del fatto che sto usando un tipo dynamic
.
Sono abbastanza sicuro di poterlo fare senza dynamic
.
mi immagino la soluzione ha qualcosa a che fare con expression trees
, ma non sono davvero sicuro di come codificare qualcosa di simile. Se qualcuno ha una buona soluzione che non usa expression trees
allora sarà interessante sentirlo anche su di esso.
Stai eseguendo tutto questo codice * ogni * volta, o memorizzando nella cache i delegati da qualche parte e quindi chiamandoli? – Dai
@Dai - Questa è una piccola porzione del mio codice e una specie di campione. Sto cercando di mettere in cache il propertyinfo, getter, setter per ogni proprietà - in modo pigro. –
Perché stai usando 'dynamic' comunque? 'Convert.ChangeType' non restituisce un oggetto tardivo. – Dai