将方法传递给泛型函数并调用它

时间:2013-01-21 11:50:01

标签: c# generics lambda

我试图写一种强类型的路由系统。 想象一下,我得到了一些带有方法A的类,它接受并返回字符串

public class SomeClass
{
    public string MethodA(string str)
    {
        return string.Format("SomeClass :: MethodA {0}", str);
    }
}

我希望我的主要方法看起来像这样

class Program
{
    static void Main(string[] args)
    {
        var col = new SomeCollection();
        col.Add<SomeClass>("url", c => c.MethodA("test")); //Bind MethodA to "url"
    }
}

所以我的问题是:

  1. 应该添加什么方法签名?
  2. 如何在SomeCollection中调用MethodA?
  3. 我猜它会像

    public class SomeCollection
    {
        public void Add<TController> (string url, Func<TController, string> exp)
        {
          // Add func to dictionary <url, funcs>
        }
    
        public void FindBestMatchAndExecute (Request request)
        {
           //Search url in collection and invoke it's method.
           //Method params we can extract from request.
        }
    }
    

1 个答案:

答案 0 :(得分:0)

首先,我认为您希望将类的实例添加到集合中,而不是类型。否则,您将需要使用反射。如果我的假设是正确的,那么不要声明Func<x,y,z,...>只使用Action来调用任何具有任意数量参数的方法。

Dictionary<object, Action> tempDictionary = new Dictionary<object, Action>();
SomeClass someClass = new SomeClass();
tempDictionary.Add(someClass, () => someClass.MethodA("test"));
tempDictionary.Single(q => q.Key == someClass).Value();

但如果您需要返回值,则必须使用Func代替Action;

Dictionary<object, Func<string>> tempDictionary = new Dictionary<object, Func<string>>();
SomeClass someClass = new SomeClass();
tempDictionary.Add(someClass, () => someClass.MethodA("test"));
string temp = tempDictionary.Single(q => q.Key == someClass).Value();