2011-10-22 13 views
6

की आवश्यकता होती है, मैं एक अभिव्यक्ति वृक्ष बनाने की कोशिश कर रहा हूं। मुझे डेटा तालिका से डेटा पढ़ने और इसके कॉलम की जांच करने की आवश्यकता है। कॉलम की जांच की जा सकती है और चेक किए जाने वाले कॉलम की संख्या केवल रन टाइम पर ही जानी जाती है। स्तंभ नाम मुझे स्ट्रिंग सरणी के रूप में दिए जाते हैं और प्रत्येक कॉलम में स्ट्रिंग की सूची की जांच की जाती है। मैंने नीचे दिए गए की तरह नमूना अभिव्यक्ति पेड़ की कोशिश की।ERROR स्टेटिक विधि को शून्य उदाहरण की आवश्यकता होती है, गैर स्थैतिक विधि को गैर-शून्य उदाहरण

यहां मुझे एक त्रुटि आ रही है।

स्टेटिक विधि को शून्य उदाहरण की आवश्यकता होती है, गैर स्थैतिक विधि को गैर-शून्य उदाहरण की आवश्यकता होती है। पैरामीटर नाम: उदाहरण के

लाइन पर

भीतरी = Expression.Call (rowexp, मील, colexp);

कृपया मेरी मदद करें !!!

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 })); 

उत्तर

9

इसका मतलब है कि जिस विधि कॉल को आप प्रस्तुत करने का प्रयास कर रहे हैं वह एक स्थिर है, लेकिन आप इसे एक लक्षित अभिव्यक्ति दे रहे हैं। यही कारण है कि कॉल करने के लिए कोशिश कर रहा है की तरह है:

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

आप एक तरह से करने के लिए है कि अभिव्यक्ति पेड़ रूप है, जो या तो अनुमति नहीं है में कोशिश कर रहे हैं।

यह इस तरह दिखता है DataRowExtensions पर Field विस्तार विधि के लिए हो रहा है - तो विस्तार विधि की 'लक्ष्य', पहले तर्क कॉल करने के लिए के रूप में व्यक्त करने की आवश्यकता है क्योंकि आप वास्तव में कॉल करना चाहते हैं:

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

तो आप चाहते हैं:

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

कि this overload कॉल करेंगे जो रास्ता दो तर्क के साथ एक स्थिर विधि कॉल करने के लिए है।

+0

क्या आप संभवतः उपर्युक्त पर थोड़ा सा विस्तार कर सकते हैं? आप अभिव्यक्ति के लिए विधि तर्क को पहली तर्क के रूप में क्यों पास करते हैं। यहां विधि कॉल करें? – Kobojunkie

+0

@ कोबोजंकी: क्योंकि आप 'Expression.Call' को बताते हैं कि हम किस स्थिर विधि में रूचि रखते हैं। Http://msdn.microsoft.com/en-us/library/bb301084.aspx देखें –