Myślę, że chcesz to:
Action<T, object> setValue = (t, o) => property.GetSetMethod().Invoke(t, new object[] { o });
lub
Action<T, object> setValue = (t, o) => property.SetValue(t, o, null);
EDIT
Aby zilustrować zakładany gorszą wydajność tej odpowiedzi w porównaniu z przyjętym odpowiedź, przyjąć tę metodę :
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());
}
}
Odpowiedź MerickOWY wykorzystuje odbicie w metodzie GetSetter
, więc przyjmujemy, że metoda GetSetter
wymaga więcej czasu, aby wykonać ją w swoim podejściu. Ta odpowiedź używa refleksji za każdym razem, gdy dzwonimy pod numer setValue.Invoke
, więc przyjmujemy, że wykonanie tej odpowiedzi zajmuje więcej czasu. Jeśli założymy, że liczba pozycji w sekwencji jest duża, odpowiedź MerickOWA powinna wymagać mniej czasu na wykonanie.
Na przykład, powiedzmy, że metoda GetSetter firmy MerickOWA zajmuje mi X milisekundy więcej niż moje, podczas gdy mój delegat setValue zajmuje Y milisekund więcej niż jego. Jeśli w sekwencji jest N pozycji, moje rozwiązanie powinno być wolniejsze niż jego (N * Y - X) milisekund.
Czy Twoja nieruchomość to nieruchomość statyczna? Jeśli nie, to nie możesz przekazać wartości null. – phoog
Nie, nie, przepraszam, że przegapiłem ten fragment, ale nawet gdy przekazuję instancję klasy, to nie działa poprawnie, nadal otrzymuję ten sam wyjątek. – ChandlerPelhams