有没有办法使用 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)
但是编译器似乎不接受动态声明的委托的静态类型方法!
还有其他想法吗?
您可以使用一个简单的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)
| 归档时间: |
|
| 查看次数: |
9556 次 |
| 最近记录: |