Warum gibt es nicht einen `fieldof` oder `methodof` - operator in C#?

Könnten Sie wie folgt verwendet werden:

FieldInfo field = fieldof(string.Empty);
MethodInfo method1 = methodof(int.ToString);
MethodInfo method2 = methodof(int.ToString(IFormatProvider));

fieldof konnte kompiliert werden, um IL:

ldtoken <field>
call FieldInfo.GetFieldFromHandle

methodof konnte kompiliert werden, um IL:

ldtoken <method>
call MethodBase.GetMethodFromHandle

Wenn die typeof - operator verwendet wird, erhalten Sie die perfekte Finden Sie Alle Referenzen, Ergebnisse. Leider, sobald Sie auf Felder oder Methoden, die Sie am Ende mit fiesen hacks. Ich denke, man kann Folgendes tun... oder Sie können gehen Sie zurück, um immer ein Feld mit Namen.

public static FieldInfo fieldof<T>(Expression<Func<T>> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    return (FieldInfo)body.Member;
}

public static MethodInfo methodof<T>(Expression<Func<T>> expression)
{
    MethodCallExpression body = (MethodCallExpression)expression.Body;
    return body.Method;
}

public static MethodInfo methodof(Expression<Action> expression)
{
    MethodCallExpression body = (MethodCallExpression)expression.Body;
    return body.Method;
}

public static void Test()
{
    FieldInfo field = fieldof(() => string.Empty);
    MethodInfo method1 = methodof(() => default(string).ToString());
    MethodInfo method2 = methodof(() => default(string).ToString(default(IFormatProvider)));
    MethodInfo method3 = methodof(() => default(List<int>).Add(default(int)));
}
  • Können Sie sich vorstellen, wie viele Male im Jahr diese Funktion verwendet werden würde?
  • Ich Schreibe eine CLI-Implementierung in C# -, wäre es äußerst hilfreich für die Identifizierung von besonderen Referenzen in der IL in der JIT-so kann ich Sie anders behandeln als. Zum Beispiel, ich möchte zu ersetzen, die IL Instanz call RuntimeHelpers.get_OffsetToStringData mit ldc.i4 <int32 offset> inline (vor native-code-generation).
  • Fein. Wie viele mal im Jahr würde diese Funktion verwendet werden, weltweit?
  • Es ist eine Häufig geforderte Eigenschaft, so scheint es vernünftig gemeinsamen Nutzung Fällen. Das heißt, natürlich würde erreichen nicht die Popularität von, sagen wir, auto-props, oder where-Klauseln verwendet werden.
  • Ich sah auf Ihrem blog Menschen beantragt, für die Reflexion.Strahlen - ich habe es auch dort. 🙂 On a side note, das C# - compiler sollte compile", typeof(int).TypeHandle" zu einfach "ldtoken <typeref int32>" ohne Umweg durch das Grundstück. (sorry, ich weiß nicht die genaue MSIL-syntax).
  • Es wäre ein äußerst verwendete feature für alle, den Umgang mit WPF (denke dependency properties), und, mehr im Allgemeinen, jeder Implementierung INotifyPropertyChanged.
  • Auch Menschen, die nicht mit WPF noch werfen ArgumentException
  • stimmt offensichtlich, aber wie ist das hier relevant?
  • Mein vorheriger Kommentar war eine Antwort auf den Kommentar von @PavelMinaev. Die ArgumentException Konstruktor überladen, nimmt zwei strings mit den Namen der betreffenden parameter der gleichen Weise, dass ein DependencyProperty registriert ist. Dies zeigt, dass die Notwendigkeit von fieldof Betreiber wäre von erheblichen nutzen, um ein breiteres Spektrum von Entwicklern neben einfach diejenigen, die auf WPF-Anwendungen.
  • Verwandte: stackoverflow.com/questions/9335126/... stackoverflow.com/questions/4229597/... stackoverflow.com/questions/11256309/...
  • Wohlgemerkt hat dieser Ansatz eine Ecke Fall (siehe stackoverflow.com/questions/6658669/...). Ich denke, wir sind besser dran, nicht zu erfinden, undokumentierte Verhalten.. Für Methoden, wie ich die Lösung hier: stackoverflow.com/questions/14329433/...
  • sehen, wie viele Fragen gibt es auf stackoverflow Bezug auf die Reflexion der Art der Mitglieder. In all diesen Fällen ist das eine nützliche Funktion. In der Tat ist die Anzahl der Duplikate für diese Anforderung selbst ist zu viele..

InformationsquelleAutor Sam Harwell | 2009-07-31
Schreibe einen Kommentar