webForumDet fria alternativet

Property-namn utan reflection?

.NET

3 svar · 320 visningar · startad av Lukaspojken

Medlem sedan maj 20011 312 inlägg
Frågan#1

Kan man hämta property-namnet för ett objekt utan reflection?

Om jag tex har ett customer-objekt med propertyn FirstName då skulle jag vilja göra något i stil med:

string propertyName = customer.FirstName.GetPropertyName();

Finns det någon sådan inbyggd metod i .NET för jag vill undvika att hårdkoda likt detta:

string propertyName = customer.GetType().GetProperty("FirstName")

Medlem sedan maj 20011 312 inlägg
#2

Detta har jag hittills kommit fram till:

        string propertyName = GetName(() => customer.FirstName);

        public static string GetName(Expression<Func<object>> property)
        {
            return property.Body.ToString().Split('.').Last();
        }

Anropet är dock inte så användarvänligt. Finns det något bättre sätt?

Medlem sedan feb. 20002 300 inlägg
#3

Din lösning liknar den som Jon Skeet mfl. föreslår på stackoverflow: http://stackoverflow.com/questions/301809/workarounds-for-nameof-operator-in-c-typesafe-databinding/301957#301957

Det är nog så bra du kan få det utan en nameof-operator.

Medlem sedan maj 20011 312 inlägg
#4

Ok, tack för tipset! GetName-metoden blev lite snyggare genom att kombinera de båda lösningarna. Slutresultatet blev denna:

     public static string GetName(Expression\<Func\<object\>\> property)  
     {  
         var body = property.Body as MemberExpression;   
         if (body == null)  
             throw new ArgumentException("'expression' should be a member expression");   
         return body.Member.Name;  
     } 

Det jag vill åstadkomma är tex detta:
customer.FirstName = dataReader[GetName(() => customer.FirstName)].ToString();

Finns det något bättre sätt att lösa det? Är tex attribut-mappning på objektet mer att föredra?

261 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)