2011-10-22 16 views
6

Bir ifade ağacı oluşturmaya çalışıyorum. Veri tablosundaki verileri okumam ve sütunlarını kontrol etmem gerekiyor. Kontrol edilecek kolonlar ve ayrıca kontrol edilecek kolon sayısı sadece çalışma zamanında bilinir. Sütun adları, bir dize dizisi olarak bana verilir ve her bir sütun, denetlenecek bir dizi Dizeye sahiptir. Aşağıdaki örnekte olduğu gibi örnek ifade ağaçları denedim.HATA Statik yöntem null örneği gerektirir, statik olmayan yöntem null olmayan örnek gerektirir

Burada bir hatayla karşılaşıyorum.

Statik yöntem null örneğini gerektirir, statik olmayan yöntem null olmayan örnek gerektirir. Parametre adı: Örnek

çizgisinde

= Expression.Call (rowexp, mi, colexp) iç;

Lütfen bana yardım edin!

IQueryable<DataRow> queryableData = CapacityTable 
    .AsEnumerable() 
    .AsQueryable() 
    .Where(row2 => values.Contains(row2.Field<string>("Head1").ToString()) 
       && values.Contains(row2.Field<string>("Head2").ToString())); 

MethodInfo mi = typeof(DataRowExtensions).GetMethod(
    "Field", 
     new Type[] { typeof(DataRow),typeof(string) }); 

mi = mi.MakeGenericMethod(typeof(string)); 

ParameterExpression rowexp = Expression.Parameter(typeof(DataRow), "row"); 
ParameterExpression valuesexp = Expression.Parameter(typeof(List<string>), "values"); 
ParameterExpression fexp = Expression.Parameter(typeof(List<string>), "types"); 
Expression inner, outer, predicateBody = null; 

foreach (var col in types) 
{ 
    // DataRow row = CapacityTable.Rows[1]; 

    ParameterExpression colexp = Expression.Parameter(typeof(string), "col"); 
    // Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes)); 

    inner = Expression.Call(rowexp,mi, colexp); 
    outer = Expression.Call(valuesexp, typeof(List<string>).GetMethod("Contains"), inner); 
    predicateBody = Expression.And(predicateBody,outer); 
} 

MethodCallExpression whereCallExpression = Expression.Call(
    typeof(Queryable), 
    "Where", 
    new Type[] { queryableData.ElementType }, 
    queryableData.Expression, 
    Expression.Lambda<Func<DataRow,bool>>(predicateBody, new ParameterExpression[] { rowexp })); 

cevap

9

Bu, temsil etmeye çalıştığınız yöntem çağrısının statik olduğu anlamına gelir, ancak siz bunu bir hedef ifadesi veriyorsunuz demektir. Bu aramaya benzer:

Thread t = new Thread(...); 
// Invalid! 
t.Sleep(1000); 

Bunu yapmak için izin verilmeyen ağaç formunda bunu yapmaya çalışıyorsunuz. Bu şuna benzer

DataRowExtensions üzerinde Field uzatma yöntemi için oluyor - yani aslında aramak istediğiniz çünkü uzatma yönteminin "hedef", çağrısına ilk argüman olarak ifade edilmesi gerekmektedir:

DataRowExtensions.Field<T>(row, col); 

Yani istiyorum: iki bağımsız değişken içeren bir statik yöntemi çağırmak için yolu olan this overload arayacak

inner = Expression.Call(mi, rowexp, colexp); 

.

+0

Yukarıdakilere biraz detay verebilir misiniz? Neden Yöntem bilgilerini burada ilk ifade olarak Expression.Call yöntemine iletiyorsunuz? – Kobojunkie

+0

@Kobojunkie: Bu, Expression.Call'a hangi statik yöntemle ilgilendiğimizi anlattığınız içindir. Bkz. Http://msdn.microsoft.com/en-us/library/bb301084.aspx –

İlgili konular