如何在VB.NET中动态调用委托链

时间:2008-12-08 16:45:57

标签: vb.net delegates

有人知道是否可以动态创建一个调用链并调用它?

假设我有两个班级A& B:

public class A
    public function Func() as B
        return new B()
    end function
end class

public class B
   public function Name() as string
      return "a string";
   end function
end class

我希望能够为 Func()获取 MethodInfo Name()并动态调用它们,以便我可以进行类似于 A.Func()的调用.Name()

我知道我可以使用 Delegate.CreateDelegate 来创建一个我可以从两个 MethodInfo 对象调用的委托但这样我只能分别调用这两个函数而不是作为呼叫链的一部分。

我想要两个解决方案一个用于.NET 3.5使用表达式树,如果可能的话,也是一个兼容.NET 2.0的解决方案

2 个答案:

答案 0 :(得分:2)

您使用的是.NET 3.5吗?如果是这样,构建表达式树来表示它应该相对简单。我没有足够的表达式树能够在没有VS打开的情况下轻松编写相关树,但如果你确认它是一个选项,我将会在记事本中工作(来自我的Eee ...因此缺少VS )。

编辑:好的,作为表达式树,你需要类似的东西(C#代码,但我相信你可以翻译):

// I assume you've already got fMethodInfo and nameMethodInfo.
Expression fCall = Expression.Call(null, fMethodInfo);
Expression nameCall = Expression.Call(fCall, nameMethodInfo);
Expression<Func<string>> lambda = Expression.Lambda<Func<string>>(nameCall, null);
Func<string> compiled = lambda.Compile();

这是未经测试的,但我认为它应该有用......

答案 1 :(得分:0)

您需要在第一个表达式之前添加此行:

Expression ctorCall = Expression.Constructor(A)

并在创建fCall

时将该表达式作为第一个参数传递

否则我们错过了链的起点,我们在运行代码时会遇到异常