2011-11-07 20 views
6

Expression<Func<T>,bool>'dan özellikleri, operatör ve eşleşen değeri almanın bir yolu var mı? Aşağıdaki örneği göz önüne alındığında:Bir Expression <Func <T, bool>> yükleminden özellikleri, operatörleri ve değerleri nasıl alırsınız?

var customers = GetCustomers(); 
var customerQuery = customers.Where(x=> x.CustomerID == 1 
    && x.CustomerName == "Bob"); // The query is for illustration only 

ben gibi bir şey çıkmak gerekiyor aşağıdaki: Başka bir İfade özellik adını çekin bir şey yazdım

Property: CustomerID 
Operator: Equals 
Value: 1 

Property: CustomerName 
Operator: Equals 
Value: Bob 

ama Expression'un DebugView özelliğinde açıkça görülebilir olmasına rağmen, değerin ve operatörün nerede tutulduğunu öğrenemiyorum.

cevap

8

operatör olacak Equals düğüm BinaryExpression sitesindeki Method. Aynı zamanda çok sayıda (Equal olmalıdır) ifadeleri de .NodeType ifadelerine bakmalısınız.

değerleri tipik olarak BinaryExpression arasında .Right bir ConstantExpression olacak ya da yakalanan bir değişken olması durumunda: değeri bir MemberExpression olacak şekilde yakalama bağlamı, ConstantExpression olacak ConstantExpression üzerinden (üyenin FieldInfo vs PropertyInfo olup olmadığını araştırmanız ve bu değerin .GetValue(...) üzerinden alınması gerekir).

+0

Mükemmel, teşekkürler. Sadece '(BinaryExpression) predicate.Body' kullanarak' yüklemi 'yapmak zorunda kaldı ve şimdi her şey oldukça açık. Şerefe Marc. – GenericTypeTea

3

Marc Gravells cevabına ek olarak (+1 var) ExpressionVisitor sınıfına bir göz atmaya değdiğini ekleyeceğim (.Net 4 içindeki kutudan çıkmış; MSDN, kopyalayıp yapıştırabileceğiniz bir örneğe sahiptir) 3.5). Belli tipteki ifadeleri çıkarmak için çok kolay bir kod oluşturur.

Sizin durumunuzda, VisitBinary yöntemini geçersiz kılmak istiyorsunuz.

Genellikle sınıfı, sınıfın benim uygulamamı üzerine kamuya açık hale getirdiğim bir okuma listesiyle ilgilenen ifadeleri/öğeleri basmak için kullanırım. İfadeyi yeniden yazmak için kullanmıyorsunuz.

+0

+1, teşekkürler. İkili İfadeleri bulmayı kesinlikle kolaylaştırıyor, ancak Marc'ın cevabını, istediğim bilgiyi nasıl çıkaracağımı söylediği şekilde bırakacağım. – GenericTypeTea

+0

Evet Katılıyorum - Marc'ın cevabı size bu soru için somun ve civatalar verir ve keneyi hak eder; benimki sadece önerdiği şeyi başarmak için basit bir yol sunuyor :) –

İlgili konular