C#中的通用方法调用任何函数并返回其返回值(如果有的话)?

C#中的通用方法调用任何函数并返回其返回值(如果有的话)?

问题描述:

我试图想到一个很好的方式调用任何类型的功能。无效或返回值,没有参数或很多。我需要定时执行此功能,并希望将所有这些从客户端隐藏起来。所以我只想给客户端代码一个方法来使用我的类来调用任何类型的函数,然后我的类将执行它并计时,然后返回到客户端。C#中的通用方法调用任何函数并返回其返回值(如果有的话)?

部分我无法弄清楚是如何支持任何类型的功能。代表需要一个类型。 func需要回报。我想要一些通用的,使客户端做最少量的工作来设置参数,最小的工作量来获得返回值(如果有的话)。

这可能没有反射?这里的表现非常重要。

我能想象客户端代码看起来像这样:

Recorder r = new Recorder(); 
r.Params.Add(param); 
r.Params.Add(param); 

r.CallFunc([function]); 

MyReturnType ret = (MyReturnType)r.returnValue; 

也似乎是可行的?

+1

你能给出的例子使用(或期望的使用)?一般来说,人们想用特定数量的参数(可能为0)调用一个函数/委托,如果有结果,就用它做一些事情。 – 2012-08-08 03:21:20

+0

你如何知道要传递什么参数值?您可能可以使用轻量级代码生成(又名DynamicMethod)和/或表达式树来做些什么。但是你必须对这些参数做些什么;你必须传递一些东西。 – 2012-08-08 03:27:01

+0

对,客户将不得不做一些工作。他们将不得不用他们的参数来建立呼叫,并且做一些更多的工作以及返回值(如果有的话)。这部分没有办法。但建立一个足够通用的类来处理这是我无法弄清楚的。 – ijjo 2012-08-08 03:28:52

你可以只超载方法。

void MyMetaFunction(Action action); 
void MyMetaFunction<T>(Action<T> action, T arg); 
TResult MyMetaFunction<TResult>(Func<TResult> func); 
TResult MyMetaFunction<TResult,TArg>(Func<TResult,TArg> func, TArg arg); 

等等。当然,这确实会限制您可以支持的参数数量,但也许这对您仍然适用。

根据您的期望和伪代码,你可以做这样的事情。

public void SomeMethod(params object[] objects) { 
} 

public void SomeMethod(out object returnValue, params object[] objects) { 
} 

此同时支持任何数量和任何类型的参数,并且可以返回一个值或不返回取决于客户机选择的过载的值。但是,我不得不说,这似乎像一个非常糟糕的主意,你会负责处理任何则传递作为参数。

有包装方法调用一种广泛使用的方法:

public static class Recorder 
{ 
    // overload for any method, that returns value 
    public static T CallFunc(Func<T> func) 
    { 
    // other stuff here 
    return func(); 
    // other stuff here 
    } 

    // overload for any method, that returns void 
    public static CallFunc(Action action) 
    { 
    // other stuff here 
    action(); 
    // other stuff here 
    } 
} 

用法:

Recorder.CallFunc(() => someObj.SomeMethod(param1, param2)); 
+0

这看起来像我需要的东西。所以我认为没有一个完美的方法可以做到这一点,但有两种方法可以覆盖它也不错! – ijjo 2012-08-08 04:19:41