2013-01-21 36 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

相關問題