1

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

假设我有两个 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 兼容的解决方案

4

2 回答 2

2

您使用的是 .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();

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

于 2008-12-08T17:04:05.597 回答
0

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

Expression ctorCall = Expression.Constructor(A)

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

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

于 2008-12-09T09:21:47.433 回答