Как динамически вызывать цепочку делегатов в VB.NET - PullRequest
1 голос
/ 08 декабря 2008

Кто-нибудь знает, возможно ли динамически создать цепочку вызовов и вызвать ее?

Допустим, у меня есть два класса 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

Я хочу получить MethodInfo для обоих Func () & Name () и вызывать их динамически, чтобы я мог получить аналогичный вызов A.Func (). Имя () .

Я знаю, что могу использовать Delegate.CreateDelegate для создания делегата, который я могу вызвать из двух MethodInfo объектов, но таким образом я могу вызывать две функции по отдельности, а не как часть цепочки вызовов.

Мне бы хотелось два решения: одно для .NET 3.5, использующее дерево выражений, и, если возможно, решение, совместимое также с .NET 2.0.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2008

Вы используете .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();

Это не проверено, но я думаю, что это должно работать ...

0 голосов
/ 09 декабря 2008

Вам нужно добавить эту строку перед первым выражением:

Expression ctorCall = Expression.Constructor(A)

И передать это выражение в качестве первого параметра при создании fCall

В противном случае нам не хватает начальной точки для цепочки, и мы получим исключение при запуске кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...