2009-12-07 40 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(); 

首先不需要编写额外的方法。任何理由不这样做?如果你真的需要它采取一种方法名称那么你需要使用一些反射 - 但我建议你尽可能避免这种情况。