Problemumgehung für das Fehlen des 'nameof' -Operators in C # für typsichere Datenbindung?
Es wurde eine Menge Gefühl, um eine nameof
- operator in C#. Als ein Beispiel dafür, wie dieser operator funktioniert, nameof(Customer.Name)
würde den string "Name"
.
Ich habe ein domain-Objekt. Und ich habe es zu binden. Und ich brauche Namen von Eigenschaften, wie die Streicher. Und ich möchte, dass Sie typsicher sein.
Ich erinnere mich, kommen über einen workaround .NET 3.5, die die Funktionalität von nameof
beteiligt und lambda-Ausdrücke. Jedoch, ich habe nicht in der Lage zu suchen, diese Problemumgehung. Kann jemand bieten, der workaround für mich?
Ich bin auch interessiert in einer Weise zu implementieren, die die Funktionalität von nameof
.NET 2.0, wenn das möglich ist.
nameof
- operator implementiert wurde in C# 6.0 .NET 4.6 und VS2015 im Juli 2015. Die folgenden Antworten sind immer noch gültig für C# < 6.0. InformationsquelleAutor der Frage badbadboy | 2008-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser code im Grunde bedeutet das:
(Natürlich ist es 3.5-code...)
InformationsquelleAutor der Antwort reshefm
Während reshefm und Jon Skeet zeigen, der richtige Weg, dies zu tun, verwenden Ausdrücke, sollte es erwähnenswert sein, es ist ein billiger Weg, dies zu tun für die Methoden-Namen:
Wickeln delegieren, um Ihre Methode bekommen die MethodInfo, und du bist gut zu gehen. Hier ist ein Beispiel:
Leider funktioniert dies nur für Methoden, es funktioniert nicht für Eigenschaften, wie Sie nicht haben Delegaten-Eigenschaft getter-oder setter-Methoden. (Scheint wie eine dumme Einschränkung, IMO.)
InformationsquelleAutor der Antwort Judah Himango
Problemumgehung: verwenden Sie einen Ausdruck-Baum, und nehmen Sie den Ausdruck tree apart zu finden, die relevanten
MemberInfo
. Da ist etwas mehr detail und Kommentar in dieser Hinweis (obwohl es nicht den code zu ziehen, die Mitglied - das ist eine andere Frage ALSO irgendwo, glaube ich).Leider als Ausdruck, der keine Bäume existieren, in .NET 2.0, es gibt wirklich keine Entsprechung.
Einer Lösung, um Tippfehler zu vermeiden, ist eine Reihe von Zugriffsmethoden, die das abrufen der relevanten
PropertyInfo
für eine bestimmte Eigenschaft, und Gerät testen. Das wäre der einzige Ort, der hatte den string in es. Dies würde Doppelarbeit zu vermeiden und machen das refactoring einfacher, aber es ist ein bisschen Drakonisch.InformationsquelleAutor der Antwort Jon Skeet
Eine Erweiterung zu dem, was reshefm hast, das vereinfacht die Nutzung der nameof () - operator und gibt die Namen der Methoden und Klassen-member und-Methoden sowie:
:
InformationsquelleAutor der Antwort Ad P.
Es sei denn, jemand ändert Ihre Meinung, die
nameof
Betreiber sieht aus wie es ' s kommen in C# 6. Hier sind die design-meeting-Notizen über:https://roslyn.codeplex.com/discussions/552376
https://roslyn.codeplex.com/discussions/552377
InformationsquelleAutor der Antwort Ronnie Overby
Akzeptierte Lösung ist schön, schlicht und elegant.
Doch bauen Sie einen Ausdruck-Baum ist teuer, und ich brauche das ganze Grundstück Weg.
Damit ich es ein bisschen geändert. Es ist nicht elegant, aber es ist einfach und funktioniert gut in den meisten Fällen:
Beispiel:
InformationsquelleAutor der Antwort Larry
Dies ist ein Teil der Sprache C# 6.0
https://msdn.microsoft.com/en-us/magazine/dn802602.aspx
InformationsquelleAutor der Antwort kotpal
Die Antwort von reshefm ist ziemlich gut, aber das ist ein bisschen einfacher API-IMO:
Beispiel:
NameOf.Property(() => new Order().Status)
Vollständige code ist hier:
http://agiledesignutilities.codeplex.com/SourceControl/changeset/view/b76cefa4234a#GeneralPurpose/NameOf.cs
InformationsquelleAutor der Antwort Sergey