编辑:清除了一些名称并使示例更易于阅读。
这堂课:
public class EntranceService : IEntranceService
{
public IMyNotifier<Entrance> Notifier { get; set; }
public EntranceService(IRepositoryConfigDb<Entrance> repo )
{
this.repo = repo;
}
}
我想使用Notifier属性通过setter注入注入。如您所见,通告程序使用具有开放泛型类型的接口,因此我无法执行以下操作:
x.SetAllProperties(p => p.OfType<IMyNotifier<IEntity>>());
StructureMap不喜欢它。 这就是IMyNotifier的样子:
public interface IMyNotifier<T> where T : class, IEntity, new()
编辑:这导致我必须为IEntity的每个具体实施设置规则,如下所示:
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Entrance>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Something>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Endpoint>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Interaction>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Queue>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Group>>());
任何帮助表示赞赏!
答案 0 :(得分:1)
好的,这不是太难......你只需要使用一种稍微不同的方法来查看你想要设置的属性。
x.SetAllProperties(
p=> p.TypeMatches(
t=>t.IsInterface
&& t.IsGenericType
&& t.GetGenericTypeDefinition() == typeof(IMyNotifier<>)
)
);
这样做是针对谓词查看属性类型。所以我们看到它是一个接口,它是通用的,然后获得开放的泛型并将其与我们想要匹配的内容进行比较。