在 C# 中将方法作为参数传递的动态委托

Kam*_*eri 5 c# dynamic

有没有办法使用 DLR 来引用 C# 中的方法?

在像 JavaScript 或 Python 这样的动态语言中,我可以轻松地将一个方法作为参数传递给另一个方法。在 C# 是静态类型语言中,我要么使用Delegate需要大量转换的类型:

public static void AddMethod(Delegate del)
{
    // implementation
}
Run Code Online (Sandbox Code Playgroud)

然后每当我调用此方法时使用强制转换

static void Main(string[] args)
{
    AddMethod(new Func<object, bool>(Test));
}

public static bool Test(object obj)
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

或者,我需要定义几十个重载来满足任何方法调用:

public static void AddMethod<TResult>(Func<TResult> method)
{
}

public static void AddMethod<T, TResult>(Func<T, TResult> method)
{
}

public static void AddMethod<T1, T2, TResult>(Func<T1, T2, TResult> method)
{
}

public static void AddMethod<T1, T2, T3, TResult>(Func<T1, T2, T3, TResult> method)
{
}
Run Code Online (Sandbox Code Playgroud)

有没有更简洁的方法来将参数定义为所有其他方法的占位符?(我试图避免MethodInfo或其他Reflection东西在这里)

我正在尝试这样的事情:

public delegate dynamic DynamicDelegate(params dynamic[] args);

public static void AddMethod(DynamicDelegate method)
{
}
Run Code Online (Sandbox Code Playgroud)

但是编译器似乎不接受动态声明的委托的静态类型方法!

还有其他想法吗?

L.B*_*L.B 5

您可以使用一个简单的Action

void AddMethod(Action action) //or void AddMethod(Func<TResult> fxn)
{
}
Run Code Online (Sandbox Code Playgroud)

并调用为

AddMethod(()=>Test(obj));   
Run Code Online (Sandbox Code Playgroud)

或者

AddMethod(()=>Test(obj1,obj2));   
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

AddMethod(() => Math.Max(1,3));  
AddMethod(() => (int)Math.Sqrt(4));
AddMethod(() => new int[]{8,5,6}.Min())

void AddMethod(Func<int> fxn)
{
     int i = fxn() * fxn();  // <---
}
Run Code Online (Sandbox Code Playgroud)