İşe ama olur Main
içeride 'obj' değişken iyi bilinen tam olması durumunda yazın. object
yeterli değildir, çünkü belirtilen tipte object
verilen herhangi bir ifade ağacı herhangi bir gerçek üye görmeyecektir. Ama zaten PropertyName
'a atadığınız için, o değişkene sahip olduğunuz anlaşılıyor. Bu gibi kullanılabilir
public static string TrimIfRequired<T>(this string str, T obj, Expression<Func<T,object>> propexpr)
:
obj.PropertyName = str.TrimIfRequired(obj, o => o.PropertyName);
veya
public static string TrimIfRequired<T>(this string str, Expression<Func<T,object>> propexpr)
bu gibi kullanılabilir (olmadan nesne
Sizin TrimIfRequired
da yani, değiştirilmesi gerekir
örnek, ancak tür açıkça stat ile Sadece
obj
vermek ve C# da otomatik olarak T alır ve lambda immediatelly kullanabilirsiniz beri ed)
obj.PropertyName = str.TrimIfRequired<MyType>(o => PropertyName);
İlki, güzeldir. Ancak, obj
değişkenine sahip olmanız gerekir. İkinci örnek, beton türünü bildiğinizde, ancak geçecek herhangi bir değişken veya örneğiniz olmadığında yararlıdır. Ancak bu nadirdir.
Her iki durumda da, analiz etmeniz gereken bir Expression<Func<T,..>>
alırsınız. Çoğunlukla, MemberExpression (özellik, alan) alırsınız ve ondan, özellik adını ayıklamanız gerekir. Ancak, kullanıcının lambda'da herhangi bir şey yazabileceğini unutmayın - derleyici için o => { foreach(..) {..}; return 1;}
, o => o.PropertyName
kadar iyidir, bu yüzden doğru ifadenin geçip geçmediğini ve en azından bazı minimal geliştiricilerin işlenmesini sağlayıp sağlamadığını tespit etmelisiniz.
BTW1. Func yerine, Eylem'i de kullanabilirsiniz, ancak bu bağlamda kullanımda tuhaf olduğunu düşünüyorum.
hemen değerini yazar
1) yardımcı (get: etkili o mülk üzerinde tanımlı bazı kısıtlamasına bir nesnenin özellik uzunluğu kısaltmak istediğiniz beri
Ancak, ben araçları aşağıdaki daha yararlı veya ergonomik olacağını düşünmek başka bir ifadeyle olarak PropertyInfo, ardından yardımcı this obj
üzerinde çağrıldı gerçeğini kullanmak ve) PropertyInfo.SetValue
çağırmak için kullanabilirsiniz
obj.TrimIfRequired(o => o.PropertyName);
özellikleri yürür ve tüm özelliklerine tüm kısıtlamaları (bildiğimiz geçerlidir 2) yardımcı nesnenin çalışma zamanı Türü, Propertie'yi tarayabiliriz s, onların Öznitelikler'i olsun, biz expr.Body olacak (onlar üyesi erişim itiraz bir dönüştürmek olacak gibi bu değer türü parametreleri için başarısız olur) kırparak ihtiyacı tam olarak ne
obj.TrimAllIfRequired();
Fantastik, teşekkürler :) – Chris
biliyorum UnaryExpression ol. 2 tür parametrelerle genel yöntem (ör. TrimIfRequired (bu dize str, Expression > propertyAccess) veya aslında "yakalama" sınıfını inbetween olarak tanıtacağınızdan, özellik türünü yazmanız gerekmez) veya UnaryExpression ile sarmayı da halledin! –
MBoros
@MBoros evet, tamamen haklısınız. Basit bir çözümle gittim ve yanıtımı "UnaryExpression" olarak güncelledik, çünkü gerçek özellik erişimini yapmıyoruz ve kutulama burada bir sorun değil, ancak yeni 'TProp' eklenmesi kullanımı biraz zorlaştırabilir –