C# 中调用任何函数并返回其返回值(如果有)的通用方法
本文关键字:如果 方法 返回值 任何 调用 函数 返回 | 更新日期: 2024-10-31 20:40:35
>我正在尝试想一种调用任何类型的函数的好方法。 void 或返回值,没有参数或很多。 我需要确定此函数的执行时间,并希望对客户端隐藏所有这些。 所以我只想给客户端代码一种使用我的类调用任何类型的函数的方法,然后我的类将执行它并计时,然后返回到客户端。
我无法弄清楚的部分是如何支持任何类型的功能。 委托需要一个类型。 FUNC需要回报。 我想要一些通用的东西,使客户端做最少的工作来设置参数,最少的工作量来获取返回值(如果有的话)。
没有反思,这可能吗? 性能在这里非常重要。
我可以想象客户端代码看起来像这样:
Recorder r = new Recorder();
r.Params.Add(param);
r.Params.Add(param);
r.CallFunc([function]);
MyReturnType ret = (MyReturnType)r.returnValue;
这似乎可行吗?
有一种广泛使用的方法来包装方法调用:
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));
你可以重载你的方法。
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) {
}
这支持任何数字和任何类型的参数,并且可以返回值或不返回值,具体取决于客户端选择的重载。但我不得不说,这似乎是一个非常糟糕的主意,你将负责处理任何作为参数传入的内容。