Sto provando a creare Delegare per leggere/scrivere proprietà di tipo sconosciuto di classe in fase di esecuzione.CreateDelegate con tipi sconosciuti
ho una classe generica Main<T>
e un metodo che assomiglia a questo:
Delegate.CreateDelegate(typeof(Func<T, object>), get)
dove get
è un MethodInfo
della proprietà che dovrebbe essere letto. Il problema è che quando la proprietà restituisce int
(suppongo che questo accada per i tipi di valore) il codice precedente genera ArgumentException perché il metodo non può essere associato. In caso di stringa funziona bene.
Per risolvere il problema, ho modificato il codice in modo che il tipo di delegato corrispondente venga generato utilizzando MakeGenericType
. Così ora il codice è:
Type func = typeof(Func<,>);
Type generic = func.MakeGenericType(typeof(T), get.ReturnType);
var result = Delegate.CreateDelegate(generic, get)
Il problema ora è che l'istanza delegato creato di generic
quindi devo usare DynamicInvoke
che sarebbe il più lentamente utilizzando la riflessione pura per leggere il campo.
Quindi la mia domanda è perché il primo frammento di codice non funziona con i tipi di valore. Secondo MSDN dovrebbe funzionare come si dice che
Il tipo di ritorno di un delegato è compatibile con il tipo di ritorno di un metodo se il tipo di ritorno del metodo è più restrittivo il tipo di ritorno del delegato
e come eseguire il delegato nel secondo snippet in modo che sia più veloce del riflesso.
Grazie.
Grazie mille, ha funzionato! – Giorgi