C# 如何包装任何函数
我想要什么C# 如何包装任何函数,c#,templates,delegates,C#,Templates,Delegates,我想要什么 Invoke(动作); 调用(Func-Func); 调用(操作) { 之前的一些行动 行动() 之后的一些行动 } 调用(Func Func) { 之前的一些行动 res=func() 之后的一些行动 返回res; } 呼叫示例: Invoke(()=>Tread.Sleep(1000)); var res=Invoke(()=>return5); 但是在函数中可以有Func,Func等等。 其主要思想是将任何代码封装在公共块中。 反思是可能的 我可以写很多方法,比如: Inv
Invoke(动作);
调用(Func-Func);
调用(操作)
{
之前的一些行动
行动()
之后的一些行动
}
调用(Func Func)
{
之前的一些行动
res=func()
之后的一些行动
返回res;
}
呼叫示例:
Invoke(()=>Tread.Sleep(1000));
var res=Invoke(()=>return5);
但是在函数中可以有Func,Func等等。
其主要思想是将任何代码封装在公共块中。
反思是可能的
我可以写很多方法,比如:
Invoke(操作)
{
之前的一些行动
行动()
之后的一些行动
}
调用(操作)
{
之前的一些行动
行动()
之后的一些行动
}
调用(操作)
{
之前的一些行动
行动()
之后的一些行动
}
但是它太烦人了。您可以将
委托的实例传递给您的方法:
void Invoke(Delegate d, params object[] args)
{
// do soemthing beforehand
d.DynamicInvoke(args);
// do something aferwards
}
但是,您会失去任何类型安全性,必须自己检查正在传递的参数的数量和类型。您可以将委托的实例传递给您的方法:
void Invoke(Delegate d, params object[] args)
{
// do soemthing beforehand
d.DynamicInvoke(args);
// do something aferwards
}
但是,您将失去任何类型安全性,并且必须自己检查正在传递的参数的数量和类型。解决方案取决于Invoke
方法是否需要修改委托的参数
如果没有,则可以像这样保持类型安全性:
void Invoke(Action action)
{
// some action before
action();
// some action after
}
TResult Invoke<TResult>(Func<TResult> func)
{
// some action before
TResult res = func();
// some action after
return res;
}
如果您的Invoke
方法确实修改了参数,那么这不能以适应任何函数的类型安全方式完成。解决方案取决于Invoke
方法是否需要修改代理的参数
如果没有,则可以像这样保持类型安全性:
void Invoke(Action action)
{
// some action before
action();
// some action after
}
TResult Invoke<TResult>(Func<TResult> func)
{
// some action before
TResult res = func();
// some action after
return res;
}
如果您的Invoke
方法确实修改了参数,那么这不能以适合任何函数的类型安全方式完成。只需将Delegate
的实例传递给您的方法和包含参数的对象数组(如果有的话)。仅保留您拥有的并传递包装器就足够了吗<代码>调用(()=>操作(p1、p2、p3))
?只需将委托的一个实例传递给您的方法和包含参数的对象数组(如果有)。只需保留您拥有的并传递包装器就足够了吗<代码>调用(()=>操作(p1、p2、p3))
?