2016-10-27 28 views
-1

你好我想創建一個接受函數T並調用它的泛型函數。將不同簽名的函數傳遞給另一個函數c#

例如: 神奇的功能應該是這樣的

public void Test() 
{ 
    InvokeFunction(Test1, "st", "sn"); 
    InvokeFunction(Test2, 7); 
} 

public void InvokeFunction(Function f) 
{ 
    f(); 
} 

public void Test1(string sT, string sFN) 
{ 
    Console.WriteLine(sT + " : " + sFN); 
} 

public string Test2(int p) 
{ 
    return p + ""; 
} 

有沒有辦法做到這一點?如果是這樣如何?

謝謝!

+0

檢查http://stackoverflow.com/questions/9410/how-do-you-pass-a-function-as-a-parameter-in-c –

回答

1

你可以這樣做,作爲Action,但你必須通過一個lambda調用具有所需參數的方法。

public void Test() 
{ 
    InvokeFunction(() => Test1("st", "sn")); 
} 

public void InvokeFunction(Action f) 
{ 
    f(); 
} 

public void Test1(string sT, string sFN) 
{ 
    Console.WriteLine(sT + " : " + sFN); 
} 

但是,如果你的方法,你想你需要使用一個Func一個獨立的通用方法的返回值。

public void Test() 
{ 
    var result = InvokeFunction(() => Test2(7)); 
    Console.WriteLine(result); 
} 

public T InvokeFunction<T>(Func<T> f) 
{ 
    return f(); 
} 

public string Test2(int p) 
{ 
    return p + ""; 
} 
+0

謝謝! 如果我有兩個無效並返回一個值?它仍然是可行的? 如果我有一個寫入和讀取操作,其中寫入無效並讀取返回值 – dan

+0

@dan當然,但你需要有兩個重載,或者更好,但給他們單獨的名稱,也許'InvokeFunction'和'InvokeAction' 。 – juharr

+0

非常感謝! – dan

0

您的方法可以有返回值或void。所以,你必須有兩個通用功能。

TValue InvokeFunction<TValue>(Func<TValue> func) 
{ 
    return func(); 
} 

void InvokeFunction(Action func) 
{ 
    func(); 
} 

用法,

var result = InvokeFunction(() => Test2(3)); 
InvokeFunction(() => Test1("p1", "p2")); 
相關問題