Учитывая блок, который содержит
namespace Foo{public class Bar;}
Как я мог создать Action<Foo.Bar>
от другого блока, не ссылаясь на первый блок во время компиляции?
При использовании
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);
Что-то мне подсказывает, что это не то, о чем вы думаете...
Вы не можете вызвать Action
в вызывающем коде, поскольку у вас не будет доступа к этому определению типа, если вы не обратитесь к нему во время компиляции. Поскольку делегаты являются контравариантными, вы можете вернуть Action
и использовать его, или использовать Action
, где интерфейс IBar
определен в ссылающейся сборке и реализован Foo.Bar
.
Если вы возвращаете Action
, вам придется либо использовать члены Foo.Bar
через отражение (или dynamic
, если вы используете C# 4.0), либо приводить его к Foo.Bar
, где код приведения имеет ссылку на сборку, в которой определен Foo.Bar
.