【问题标题】:How to dynamically invoke a chain of delegates in VB.NET如何在 VB.NET 中动态调用委托链
【发布时间】:2008-12-08 16:45:57
【问题描述】:

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

假设我有两个 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()Name()MethodInfo 并动态调用它们以便我可以得到类似于 A.Func().Name() 的调用。

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

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

【问题讨论】:

    标签: vb.net delegates


    【解决方案1】:

    您使用的是 .NET 3.5 吗?如果是这样,构建一个表达式树来表示它应该相对简单。我没有足够的 expression-tree-fu 在没有打开 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();
    

    这是未经测试的,但我认为它应该可以工作......

    【讨论】:

    • 是的,您可以使用 3.5 来解决这个问题 - 尽管我更喜欢 2.0 兼容的解决方案(如果存在的话)
    【解决方案2】:

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

    Expression ctorCall = Expression.Constructor(A)
    

    并在创建 fCall 时将该表达式作为第一个参数传递

    否则我们会丢失链的起点,并且在运行代码时会出现异常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      相关资源
      最近更新 更多