2016-03-23 21 views
1

yöntemimin imzaLimiti basit özelliğine Lambda deyimi

void Sample<TData>(Expression<Func<TData,TValue>> expression) { } 

Ben izin vermek istediğiniz gibi aramaları: denedim

Sample <MyData>(m => m.SomeProperty); 

Ama

Sample<MyData>(m => m.ComplexProperty.AnotherProperty); 

iç içe geçmiş bedenlerin sayısını sayın ve ifadeyi yuvalama sayısı 1 olanlarla sınırlayın, ancak 'SomeProperty' bir temel c'den türetildiğinde bu başarısız olur. lass.

private static int ItemCount(Expression lambaExpression) 
{ 
    int itemCount = 0; 
    var member = lambaExpression as MemberExpression; 
    while (member != null) 
    { 
     itemCount += 1; 
     member = member.Expression as MemberExpression; 
    } 
    return itemCount; 
} 

Sorum şu: Nasıl 'foo.bar' ve 'Foo.Bar.Bar' ayırt edersiniz? Buna benzer

+0

Bu, İfade ile tamamen ilgili olsa bile. Bir geliştiriciden ve kullanıcı açısından bakıldığında bunun böyle olduğundan şüpheleniyor. Her şey olabilir bir İfadeyi kabul eden bir işlev sağlarsınız ve bu da bir geliştirici olarak beklediğim ve daha sonra onu sınırlandıracağınız sözcükler. Bu işlevin kullanıcıları sınırlı olduklarını öğrenmek için ekstra bir sınıf yazmayı öneririm – ckruczek

+0

@ckruczek Bu gibi bir sınırlama akıcı arayüzlerde oldukça yaygındır (evet, fark ettiğinizde oldukça çirkin olur :-)) – xanatos

+0

@ckruczek: Örnek bir çerçeve yazıyorum ve kullanıcıları Demeter Yasasını takip etmeye teşvik etmek istiyorum. – alzaimar

cevap

1

şey:

public static void Sample<TData, TValue>(Expression<Func<TData, TValue>> expression) 
{ 
    var body = expression.Body; 
    var par1 = expression.Parameters[0]; 

    MemberExpression member = body as MemberExpression; 

    if (member == null) 
    { 
     throw new ArgumentException(); 
    } 

    if (member.Expression != par1) 
    { 
     throw new ArgumentException(); 
    } 

    // Success 
} 

Sadece MemberExpression ait Expression mülkiyet lambda ifade parametre (par1) olduğunu kontrol edin.

+1

Oh? Parametreler []? Bunu özledim mi? Çok teşekkürler. Bir deneyeceğim. – alzaimar

+0

Ne yazık ki, çözüm bir temel sınıfta bildirilen, ancak türetilmiş bir sınıftan erişilen bir özellik için çalışmıyor gibi görünüyor. – alzaimar

+0

@alzaimar Bir örnek? – xanatos