使用Var方法输入的方法?

时间:2011-11-13 12:30:14

标签: c#

在C#中:

是否可以定义输入参数是任何方法的方法?

让我更好地描述一下:

我想要一个带签名的方法

bool IsDoit(var method)
{
    try
    {
        method(...);
        return true;
    }
    catch{return false;}
}

这得到一个方法并返回一个抛出异常的布尔值!

通用代表?通用行动?通用功能?

您有任何想法,或不可能

4 个答案:

答案 0 :(得分:7)

这里的“......”会怎么样?听起来你想要一些描述的委托 - 并且委托签名应该与你想要调用的方法匹配。例如:

static bool IsDoit(Action method)
{
    try
    {
        method();
        return true;
    }
    catch
    {
        return false;
    }
}

这将允许任何无参数void方法的方法组转换:

if (IsDoIt(SomeMethodWithNoParameters))
{
}

如果调用者想要调用带有其他参数的方法,他们可以使用lambda表达式将其包装在Action中:

if (IsDoIt(() => MethodWithParameters("first", "second"))
{
}

就我个人而言,我并非所有首先确定这个设计的智慧,请注意 - 捕捉异常并吞下它们而不进行任何记录对我来说似乎是一个非常糟糕的主意

答案 1 :(得分:1)

是的,对于无参数方法,请将var替换为Action

答案 2 :(得分:1)

您可以将您的方法作为委托传递,例如使用操作:

bool IsDoit(Action test)
{
   test(...);
} 

答案 3 :(得分:1)

您始终可以接受通用委托。代表全部来自System.Delegate

using System;

public class Program
{
    public delegate R Deleg1<R,T1>(T1 arg);
    public delegate R Deleg2<R,T1,T2>(T1 arg1, T2 arg2);
    public delegate R Deleg3<R,T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3);

    public static void AcceptAny<R,T1>(Deleg1<R,T1> del) {  /**/ }
    public static void AcceptAny<R,T1,T2>(Deleg2<R,T1,T2> del) {  /**/ }
    public static void AcceptAny<R,T1,T2,T3>(Deleg3<R,T1,T2,T3> del) {  /**/ }

    public static void Main(string[] args)
    {
    }
}

如果你不介意一点点擦除,你可以

public delegate R DelegParams<R>(params object[] @params);
public static void AcceptAny<R>(DelegParams<R> paramsFunc) {  /**/ }

你可以间接地通过使用lambda表达式来包装它来将大多数任何委托分配给此签名(非常类似于Jon Skeet所示的Action方法)。

请注意,委托共享一个公共基类,并允许您使用“类似反射”的接口来调用它们(将通用object[]作为参数,例如): Delegate.DynamicInvoke Method