0

我正在尝试编写某种强类型路由系统。想象一下,我有一个带有方法 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?

我想它会是这样的

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.
    }
}
4

1 回答 1

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();
于 2013-01-21T11:55:08.693 回答