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
mitldc.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 einDependencyProperty
registriert ist. Dies zeigt, dass die Notwendigkeit vonfieldof
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..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eric Lippert (auf der C# - design-team) hat eine ausgezeichnete übersicht/Diskussion über dieses Thema hier. Zitat:
ldtoken
IL-Anweisung. Odercpblk
undinitblk
für diese Angelegenheit.Kann man eigentlich vermeiden, mit nachdenken und lambdas (.NET Framework 2.0). Betrachten Sie die folgende Klasse:
und es Verwendung:
MethodInfo parse = ((Func<string, int>)int.Parse).Method;
ist vollständig integriert und somit nicht erforderlich ist, irgendwelche helper-Klasse. Mir scheint, der springende Punkt hier ist, um zu vermeiden, dass die Darsteller, die Ihnen erlauben würde, eigentlich eine die Signatur zur Laufzeit, wenn alles, was Sie zur Verfügung stellen müssen zur compile-Zeit wird der name der Methode token.void
(nicht zurückgegeben) - Methode.@280Z28 - Wir saßen nur unten, um herauszufinden, wie Sie dies tun, wenn ich Ihre Frage & code. Wir brauchten einen PropertyOf Methode, so dass ich ihn Hinzugefügt haben. Hier ist es, falls jemand anderes es braucht. Thx für die große Frage.
Dictionary<Type,MemberInfo>
Karte. Wenn man sich die IL generiert, indem die expression tree Zucker, Sie können sehen, dass Sie nicht wollen, zu laufen, es sei denn, Sie zu haben. Die #1 Vorteil sehe ich, dass Sie als Sprache für die Betreiber ist der IL/wäre sehr lapidar.<object> () => IntProperty()
.dies ist ein generischer Typ, version, kann verwenden Sie die F2-Taste umbenennen und nicht brauchen, existierenden code zu ändern
im Beispiel wird der name der Methode ist GetPKValue