2013-01-21 37 views
0

即时尝试编写某种类型的强类型路由系统。 试想香港专业教育学院得到了一些类方法的是需要返回字符串将方法传递到泛型函数并调用它

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. 
    } 
} 
+1

问题是:你从哪里得到'SomeClass'的实例应该传入lambda表达式? –

+1

@defaultlocale:'c'是lambda表达式的参数,就像'x'在'Select(x => x.Id)'中一样。 –

+0

@DanielHilgarth,谢谢,实际上我误解了这个问题。 –

回答

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(); 
+0

其实,即时通讯尝试写某种强类型的路由系统。所以我没有实例在即时im绑定到不同类的方法的网址。 – Egor

+0

原创文章编辑。 – Egor

相关问题