使用linq表达式的通用方法

时间:2009-12-07 09:49:16

标签: c# .net 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;
        }

我想创建一个泛型方法而不是Method2,比如

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

任何提示?

感谢。

3 个答案:

答案 0 :(得分:1)

在我看来,你可以做到:

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

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

首先,根本不需要编写额外的方法。有什么理由不这样做?如果你真的需要它来采用方法 name 那么你需要使用一些反思 - 但我建议你尽可能避免这种情况。

答案 1 :(得分: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));

答案 2 :(得分: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++;
   }
}