Criar delegado por meio da reflection

Dado um assembly que contém

namespace Foo{public class Bar;} 

Como eu poderia criar uma Action de outro assembly sem fazer referência ao primeiro assembly em tempo de compilation?

Se você usar

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

actionType agora representará a Action . No entanto, para usá-lo, você precisará contintue para usar reflection, então você precisará encontrar um MethodInfo que se encheckbox no void(Foo.Bar) assinatura void(Foo.Bar) e chamar Delegate.CreateDelegate para criar um delegado. E você precisará do Delegate.DynamicInvoke para executá-lo.

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

Algo me diz que não é o que você está pensando

Você não pode chamá-lo de Action em seu código de chamada, já que você não terá access a essa definição de tipo se não fizer referência a ele em tempo de compilation. Como Delegates são contravariantes, você pode retornar um Action e usá-lo, ou usar Action onde a interface do IBar é definida em um assembly referenciado e implementada pelo Foo.Bar .

Se você retornar uma Action , você teria que usar os membros do Foo.Bar por meio de reflection (ou dynamic se estiver usando o C # 4.0) ou usar o cast para Foo.Bar onde o código de casting tem uma referência ao assembly onde Foo.Bar é definido.