Penso che si desidera questo:
Action<T, object> setValue = (t, o) => property.GetSetMethod().Invoke(t, new object[] { o });
o
Action<T, object> setValue = (t, o) => property.SetValue(t, o, null);
EDIT
Per illustrare l'andamento peggiore assunto di questa risposta rispetto alla risposta accettata, assumere questo metodo :
void SetAnObjectPropertyOnALotOfObjects<T>(IEnumerable<T> objs)
{
//Create a delegate and assign a reference to that delegate to the setValue variable
Action<T, object> setValue = GetSetter();
foreach (var o in objs)
{
//invoke the delegate referred to by the setValue variable (that is, "invoke its referent"
setValue.Invoke(o, new object());
}
}
La risposta di MerickOWA utilizza la riflessione nel metodo GetSetter
, pertanto si assume che il metodo GetSetter
richieda più tempo per l'esecuzione, nel suo approccio. Questa risposta utilizza la riflessione ogni volta che chiamiamo setValue.Invoke
, quindi assumiamo che ci vuole più tempo per eseguire questa risposta. Se assumiamo che il numero di elementi nella sequenza sia ampio, la risposta di MerickOWA dovrebbe richiedere meno tempo per l'esecuzione.
Ad esempio, diciamo che il metodo GetSetter di MerickOWA impiega X millisecondi più del mio per essere eseguito, mentre il mio delegato setValue richiede Y millisecondi più del suo. Se ci sono N elementi nella sequenza, la mia soluzione dovrebbe essere più lenta del suo da (N * Y - X) millisecondi.
La tua proprietà è di proprietà statica? In caso contrario, non è possibile passare nulla. – phoog
No, non è dispiaciuto, mi spiace di aver perso quel pezzo, ma anche quando passo in un'istanza della classe non funziona correttamente, ottengo comunque la stessa eccezione – ChandlerPelhams