ich folgende Dienstprogramm So verwenden Sie den Namen eines Feldes/Eigenschaft von einer Instanz einer Klasse zu erhalten ...Holen Sie sich den Namen eines Feldes aus einer Klasse ohne eine Instanz
public static string FieldName<T>(Expression<Func<T>> Source)
{
return ((MemberExpression)Source.Body).Member.Name;
}
Dies ermöglicht es mir zu wie folgt vorgehen:
public class CoolCat
{
public string KaratePower;
}
public class Program
{
public static Main()
{
public CoolCat Jimmy = new CoolCat();
string JimmysKaratePowerField = FieldName(() => Jimmy.KaratePower);
}
}
Dies ist für die Serialisierung und andere Zeiten, in denen ich eine String-Darstellung des Feldnamens benötigen.
Aber jetzt, ich möchte in der Lage sein, den Feldnamen OHNE eine Instanz der Klasse zu bekommen - zum Beispiel, wenn ich eine Tabelle aufstellen und die FieldNames der Spalten dynamisch mit tatsächlichen Feldern in a verknüpfen will Klasse (so Refactorings, etc. wird es nicht brechen).
Grundsätzlich Ich fühle mich wie ich ganz einfach nicht die Syntax bekommen, wie dies zu erreichen, aber ich glaube, dass es so etwas wie folgt aussehen:
public static string ClassFieldName<T>(Func<T> PropertyFunction)
{
// Do something to get the field name? I'm not sure whether 'Func' is the right thing here - but I would imagine that it is something where I could pass in a lambda type expression or something of the sort?
}
public class Program
{
public static Main()
{
string CatsPowerFieldName = ClassFieldName<CoolCat>((x) => x.KaratePower);
// This 'CatsPowerFieldName' would be set to "KaratePower".
}
}
Ich hoffe, das macht Sinn - ich Ich bin nicht sehr gut mit dem Vokabular rund um dieses Thema, also weiß ich, dass die Frage ein wenig vage ist.
Ich mag diese Lösung wirklich - könnten Sie vielleicht über den Abschnitt, den Sie mit Nullable Eigenschaften hinzugefügt hinzufügen? Wann würde dieser Codeabschnitt verwendet werden? –
William
Wenn KaratePower eine 'Nullable' oder 'T?' Wie 'int?' Oder 'DateTime?' Ist, dann ist der Body kein MemberExpression, sondern ein UnaryExpression. Von dort müssen Sie den Operanden UnaryExpression nehmen, um die korrekte MemberExpression zu erhalten. –
cadrell0