2014-12-27 21 views
5

Bir dizeden "Özellik Seçici" oluşturmaya çalışıyorum. Özellik seçici oluşturma Dizgeden ifade etme

bana Gerçek hayat örnekle kendimi biraz açıklayalım:

Biz İsim (string) özelliğe sahip bir kişi sınıf var.

el bu propertySelector yazı gibi bir "özellik seçici" oluşturabilir:

Expression<Func<Person, string>> propertySelector = x => x.Name; 

Ama benim yöntemi ile aynı özellik seçici almak istiyorum.

public static Expression<Func<TIn, TOut>> CreatePropertySelectorExpression<TIn, TOut>(string path) 
{ 
    Expression exp = Expression.Parameter(typeof(TIn), "x"); 
    foreach (var property in path.Split('.')) 
    { 
     exp = Expression.PropertyOrField(exp, property); 
    } 
    return exp; 
} 

Ama ... var ve geçersiz dökme hata ettik:

var propertySelector = CreatePropertySelectorExpression<Person, string>("Name"); 

Ne var bugüne kadar bu!

dolaylı 'System.Linq.Expressions.Expression>' tip 'System.Linq.Expressions.Expression' dönüştürülemez. Bir açık dönüşüm

Ben İfadeler çok yeniyim ve devam etmek nasıl bilmiyorum :(

+0

Eğer kullanım gerçek örneğini ekleyebilir lütfen? – InferOn

+0

örnek Expression.Parameter ParameterExpression dönecektir için bazı hata, kodunuzda var Expression.PropertyOrField içtenlikle sana – InferOn

+0

, sadece yaptığım düzenlemeyi kontrol edin başarmak ne anlamıyorum, MemberExpression dönecektir. Çok daha iyi bir örnek verdim. Belki de kod yanlıştır. Ben Expressions hakkında bir acemi değilim: (Şimdiden teşekkürler! – SuperJMN

cevap

12

Sizin exp sadece lambda gövdesini içeren (bir döküm eksik?) Var ..

var param = Expression.Parameter(typeof(TIn)); 
var body = Expression.PropertyOrField(param, propertyName); 
return Expression.Lambda<Func<TIn, TOut>>(body, param); 

not ifadesi gerçekten çok yardımcı olmadığını muhtemelen istiyorum gerçi. Ama sen Expression.Lambda kullanarak bir lambda oluşturmak için gereken Yani orada tip TIn bir parametre alır gerçek bir lambda fonksiyonu istiyorum derlenmiş fu nction yerine:

private static Func<TIn, TOut> CreatePropertyAccessor<TIn, TOut> (string propertyName) 
{ 
    var param = Expression.Parameter(typeof(TIn)); 
    var body = Expression.PropertyOrField(param, propertyName); 
    return Expression.Lambda<Func<TIn, TOut>>(body, param).Compile(); 
} 

Daha sonra, bu gibi kullanabilirsiniz:

var name1 = CreatePropertyAccessor<Obj, string>("Name"); 
var name2 = CreatePropertyAccessor<Obj, string>("Name2"); 
var name3 = CreatePropertyAccessor<Obj, string>("Name3"); 

var o = new Obj() // Obj is a type with those three properties 
{ 
    Name = "foo", 
    Name2 = "bar", 
    Name3 = "baz" 
}; 

Console.WriteLine(name1(o)); // "foo" 
Console.WriteLine(name2(o)); // "bar" 
Console.WriteLine(name3(o)); // "baz" 
+0

Sadece vay! İşleri! Teşekkür ederim! – SuperJMN

İlgili konular