więc używam następujące narzędzia, aby uzyskać nazwę pola/nieruchomość z instancji klasy ...Uzyskaj nazwę pola z klasy bez instancji
public static string FieldName<T>(Expression<Func<T>> Source)
{
return ((MemberExpression)Source.Body).Member.Name;
}
To pozwala mi Wykonaj następujące czynności:
public class CoolCat
{
public string KaratePower;
}
public class Program
{
public static Main()
{
public CoolCat Jimmy = new CoolCat();
string JimmysKaratePowerField = FieldName(() => Jimmy.KaratePower);
}
}
Jest to idealne rozwiązanie do serializacji i innych sytuacji, gdy potrzebuję reprezentacji łańcuchowej nazwy pola.
Ale teraz chcę mieć możliwość otrzymania nazwy pola BEZ instancji klasy - na przykład, jeśli konfiguruję tabelę i chcę dynamicznie łączyć FieldNames kolumn z rzeczywistymi polami w klasa (więc refaktoryzacja itp. go nie przerwie).
Zasadniczo, czuję się po prostu nie dość dostać składnię, jak tego dokonać, ale wyobrażam sobie, że będzie to wyglądać mniej więcej tak:
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".
}
}
Mam nadzieję, że sens - I” Nie jestem zbyt dobry w odniesieniu do tego tematu, więc wiem, że pytanie jest trochę niejasne.
Naprawdę podoba mi się to rozwiązanie - czy mógłbyś omówić sekcję dodaną do właściwości Nullable? Kiedy należy użyć tej części kodu? –
William
Jeśli KaratePower jest 'Nullable' lub 'T?' Takie jak 'int?' Lub 'DateTime?', To ciało nie będzie MemberExpression, będzie to UnaryExpression. Stamtąd musisz wziąć operand UnaryExpression, aby uzyskać poprawną wartość MemberExpression. –
cadrell0