2015-08-11 24 views
5

Özellik adı C# içindeki Lambda ifadesine nasıl dönüştürebilirim? Bunun gibiÖzellik Adı Lambda Expression C#

: string prop = "Name"; (p => p.Name)

public class Person{ 
    public string Name{ get; set; } 
} 

sayesinde!

+0

Lambda deyimi bir tür değil. Bir temsilci mi yoksa bir ifade ağacı mı demek istiyorsun? Ve tam olarak * ne tür? –

+0

Sorunuzu anlamıyorum ... Bir değişken bildirimini özellik erişimi ifadesine dönüştürmek ister misiniz? –

+0

Lütfen neyi başarmaya çalıştığınızı açıklayın. Bir özellik isminin Lambda'ya dönüştürülmesi gerçekten anlamlı değildir. Biraz bağlam ekle. –

cevap

11

kullanarak ifade ağaçları Lambda ifade oluşturabilir.

using System.Linq.Expressions; 
public static Expression<Func<T, object>> GetPropertySelector<T>(string propertyName) 
{ 
    var arg = Expression.Parameter(typeof(T), "x"); 
    var property = Expression.Property(arg, propertyName); 
    //return the property as object 
    var conv = Expression.Convert(property, typeof(object)); 
    var exp = Expression.Lambda<Func<T, object>>(conv, new ParameterExpression[] { arg }); 
    return exp; 
} 

Person için hoşuna arayabilirsiniz:

var exp = GetPropertySelector<Person>("Name");//exp: x=>x.Name 
+1

Bu Evet, haklısınız yansıma –

+0

değildir. Cevabı düzelttim. –

+0

Bu yalnızca dize için çalışır. Expression.Lambda > genel yapmak için bir yolu var mı? Expression.Lambda > denedim ama çalışmadı. –

1

Bir lambda yalnızca anonim bir işlevdir. Lambdaları delege olarak düzenli yöntemlerde saklayabilirsiniz. "İsim" özelliğini bir özellik yapmaya çalışmanı öneririm. Eğer gerçekten bir lambda istiyorsanız

public string Name { get { return p.Name; } }

gibi Func gibi bir temsilci türü kullanın.

public Func<string> Name =() => p.Name;

+0

Bir lambda bir anonim yöntem kendi başına değil .. –

+0

iyi evet, onun yerini tanımlamak için bir adı yok çünkü. –

+0

Peki ya ifade ağaçları? Onlar da delegeler mi? : P –