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))