Создайте делегата через отражение

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

namespace Foo{public class Bar;}

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

6
задан dss539 11 June 2010 в 16:10
поделиться

2 ответа

При использовании

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

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

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

Что-то мне подсказывает, что это не то, о чем вы думаете...

10
ответ дан 8 December 2019 в 18:32
поделиться

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

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

3
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: