Gibt es eine Möglichkeit zu schaffen, einen Delegierten zum abrufen und festlegen von Werten für ein FieldInfo?

Für Eigenschaften gibt es GetGetMethod und GetSetMethod so dass ich tun kann:

Getter = (Func<S, T>)Delegate.CreateDelegate(typeof(Func<S, T>), 
                                             propertyInfo.GetGetMethod());

und

Setter = (Action<S, T>)Delegate.CreateDelegate(typeof(Action<S, T>), 
                                               propertyInfo.GetSetMethod());

Aber wie gehe ich über die FieldInfos?

Ich bin nicht auf der Suche nach Delegierten zu GetValue und SetValue (was bedeutet, ich werde aufrufen Reflexion jedes mal)

Getter = s => (T)fieldInfo.GetValue(s);
Setter = (s, t) => (T)fieldInfo.SetValue(s, t);

aber wenn es ein CreateDelegate Ansatz hier? Ich meine seit Zuweisungen einen Wert zurückgeben, kann ich behandeln Aufgaben wie eine Methode? Wenn ja, ist es ein MethodInfo Griff für es? In anderen Worten wie gebe ich die Recht MethodInfo einstellen und immer einen Wert von einem member Bereich zu CreateDelegate Methode, so daß ich einen Delegat zurück, mit dem ich Lesen und schreiben kann-Felder direkt?

Getter = (Func<S, T>)Delegate.CreateDelegate(typeof(Func<S, T>), fieldInfo.??);
Setter = (Action<S, T>)Delegate.CreateDelegate(typeof(Action<S, T>), fieldInfo.??);

Ich kann Ausdruck erstellen und zu kompilieren, aber ich bin auf der Suche nach etwas einfacher. Am Ende habe ich nicht dagegen, geht der Ausdruck der route, wenn es keine Antwort für die gestellte Frage, wie unten gezeigt:

var instExp = Expression.Parameter(typeof(S));
var fieldExp = Expression.Field(instExp, fieldInfo);
Getter = Expression.Lambda<Func<S, T>>(fieldExp, instExp).Compile();
if (!fieldInfo.IsInitOnly)
{
    var valueExp = Expression.Parameter(typeof(T));
    Setter = Expression.Lambda<Action<S, T>>(Expression.Assign(fieldExp, valueExp), instExp, valueExp).Compile();
}

Oder bin ich nach der nicht vorhandenen (da habe ich nirgends gesehen, sowas noch) ?

  • Gibt es irgendein Grund, warum Sie benötigen, um call Delegate.CreateDelegate? Sie haben bereits einen Delegierten mit getter. Einfach anrufen getter(myInstanceOfT) ruft die fieldInfo.GetValue Methode und kehren Sie den Wert.
  • ja die Leistung ist der Schlüssel. Siehe diesen thread: stackoverflow.com/questions/8087611/...
  • Diese Func<S, T> getter = s => (T)fieldInfo.GetValue(s); alle, die Sie tun können, weil Feld nicht den setter\getter-Methode, wie es ist in einer Eigenschaft. Wenn die Leistung der Schlüssel ich empfehle den Ausdruck.
  • Ich weiß, ich muss schließlich Ausdruck verwenden, wenn ich nicht bestehen können, eine methodinfo für die Einstellung und Werte zu einem Feld. Einfach zu sehen, ob es simuliert werden kann.
  • Sie wollen auch das delegieren von arbeiten für readonly-Felder und private Felder?
  • readonly-Felder sollten nur lesbar sein. Für private Felder, ja (aber ich werde nur im privaten Rahmen - ich meine innerhalb der Klasse selbst). Im Grunde werde ich respektieren den Schutz/privacy/Sichtbarkeit
  • Werfen Sie einen Blick auf meine Antwort. Sie können es ändern, wie auch immer Sie wollen, Präfekt readonly-Felder bleiben readonly oder Sie zwangsweise überschreiben. Mit diesen zwei kleinen Funktionen, die mich gerettet eine Menge Zeit.
  • Ich sah schon auf Ihre Antwort, da es veröffentlicht wurde. Und wie gesagt, es ist nur etwas, was ich schon geschrieben in meiner Frage.
  • Stimmt... Sie schon vorgeschlagen, in diese Richtung. Aber Sie bat um etwas so einfaches wie: '(Func<S, T>)zu Delegieren.CreateDelegate(typeof(Func<S, T>), fieldInfo.?);' Solche Funktionen, die nicht vorhanden ist! Ich habe nur vorgeschlagen, um zu schaffen, wie eine "einfache" Funktion selbst. Auf diese Weise verhindern Sie, dass Sie mit Ausdrücken, die überall im code, und Sie können einfach anrufen, die einfache Funktion, genau das, was Sie gefragt haben. Nun, wenn der KÖRPER von dieser Funktion kann einfacher sein, die Antwort ist einfach: NEIN! (mit der opion, dass IL ist nicht einfacher). Perhapse ich missverstehen Ihre Frage: willst du ein einfacher Anruf oder ein einfacher Körper?
  • Ehrlich gesagt, ich war nach einer get-set Methode-pair-Mädchen für fieldinfo (ähnliche Eigenschaften) und überhaupt nicht nach einer Funktion mit dem Namen CreateDelegate aber intern geht die expression route. Das war nicht der Zweck der Frage. Wenn Sie nahm es so, tut mir Leid. Ich akzeptiere kann ich nicht formulieren, dass die Frage so deutlich wie Sie wollte. Ich habe nicht gefragt, eine Frage nicht zu wissen, wie refactor-Methode und geben Sie ihm einen Namen. Sicherlich nicht um zu öffnen ein Kopfgeld für Sie.
  • Naja... in diesem Fall ist die Antwort einfach: Nein, es gibt Keine vorhandene (schnell) Get/Set-Methoden für ein Feld, nur der (langsame) GetValue/SetValue von FieldInfo.

InformationsquelleAutor nawfal | 2013-04-18
Schreibe einen Kommentar