Создать делегата через отражение - PullRequest
6 голосов
/ 11 июня 2010

Учитывая сборку, которая содержит

namespace Foo{public class Bar;}

Как я могу создать Action<Foo.Bar> из другой сборки, не ссылаясь на первую сборку во время компиляции?

Ответы [ 2 ]

10 голосов
/ 11 июня 2010

Если вы используете

Type barType = Type.GetType("Foo.Bar, whateverassembly");
Type actionType = typeof(Action<>).MakeGenericType(barType);

actionType теперь будет представлять Action<Foo.Bar>. Однако, чтобы использовать его, вам нужно будет продолжать использовать рефлексию, поэтому вам нужно найти MethodInfo, который соответствует подписи void(Foo.Bar), и вызвать Delegate.CreateDelegate, чтобы создать делегата. И вам понадобится Delegate.DynamicInvoke, чтобы выполнить его.

Delegate call = Delegate.CreateDelegate(actionType, ...);
...
call.DynamicInvoke(someBar);

Что-то говорит мне, что это не то, о чем ты думаешь ...

3 голосов
/ 11 июня 2010

Вы не можете назвать его Action<Foo.Bar> в своем коде вызова, поскольку у вас не будет доступа к определению этого типа, если вы не будете ссылаться на него во время компиляции. Поскольку делегаты противоречивы, вы можете вернуть Action<Object> и использовать его или использовать Action<IBar>, где интерфейс IBar определен в ссылочной сборке и реализован с помощью Foo.Bar.

Если вы вернете Action<Object>, вам придется либо использовать Foo.Bar членов с помощью отражения (или dynamic при использовании C # 4.0), либо использовать приведение к Foo.Bar, где код приведения имеет ссылку в сборку, где определен Foo.Bar.

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