2009-12-07 66 views
0

我接下來的2種方法:一般使用方法LINQ表達式

 public static string[] Method1(CustomObj co) 
     { 
      return new string[] {co.X,co.Y }; 
     } 

     public static string[][] Method2(IQueryable<CustomObj> cos) 
     { 
      string[][] s = new string[cos.Count()][]; 
      int i = 0; 
      foreach (var co in cos) 
      { 
       s.SetValue(Method1(co), i); 
       i++; 
      } 
      return s; 
     } 

我想打一個通用的方法,而不是方法2,類似

static string[][] Method2(this IQueryable query, string method1Name) 

任何提示嗎?

謝謝。

回答

0

你想要的是使用方法1作爲委託。

public delegate string[] MyDelegate<T>(T obj); 

public static string Method2<T>(this IQueryAble<T> cos, MyDelegate<T> function1) 
{ 
    string[][] s = new string[cos.Count()][]; 
    int i = 0; 
    foreach (var co in cos) 
    { 
     s.SetValue(function1(co), i); 
     i++; 
    } 
} 
+0

非常感謝,問題解決了 – bogus 2009-12-07 10:06:22

0

您是否必須傳入方法名稱的字符串?這不是微不足道的。

大多數的LINQ擴展方法需要一個lambda的方法來調用:

public static string[][] Method2(this IQueryable<CustomObj> cos, Func<CustomObj, string[]> func)   
{    
    string[][] s = new string[cos.Count()][]; 
    int i = 0;    
    foreach (var co in cos)    
    {     
     s.SetValue(func(co), i); 
     i++;    
    } 
    return s;   
} 

然後,你可以這樣調用:

iqueryableobject.Method2(x => Method1(x)); 
1

它看起來像你對我可以做:

string[][] ret = query.Select(x => Method1(x)).ToArray(); 

string[][] ret = query.Select<CustomObject, string[]>(Method1).ToArray(); 

首先不需要編寫額外的方法。任何理由不這樣做?如果你真的需要它採取一種方法名稱那麼你需要使用一些反射 - 但我建議你儘可能避免這種情況。