2016-10-27 26 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")); 
相关问题