我有以下代码
public abstract class Parent
{
AnObject AProperty {get; set;}
}
public class ChildA : Parent { }
public class ChildB : Parent { }
当我通过反射访问ChildA
的实例时,我发现其成员AProperty的DeclaringType
等于Parent
。可悲的是,我想依靠反思来确定谁是ChildA,谁是ChildB。
更多上下文:我实际上是尝试通过NInject使用when子句绑定AProperty
,以便根据要创建的对象的实际类型进行不同的解析。这是一个简单的例子:
Kernel.Bind<AnObject>().ToConstructor(..).WhenAnyAncestorMatches(c =>
c.Request.Target.Member
.DeclaringType.IsAssignableFrom(typeof(ChildA))
Kernel.Bind<AnObject>().ToConstructor(..).WhenAnyAncestorMatches(c =>
c.Request.Target.Member
.DeclaringType.IsAssignableFrom(typeof(ChildB))
问题:
AProperty
设置为abstract
并在每个ChildX
上覆盖它?WhenAnyAncestorMatches
谓词中获取实际类型吗?答案 0 :(得分:1)
如果我找到你,你想要将不同的AnObject
注入属性AProperty
,具体取决于它注入的子类。
提示:如果没有令人信服的理由,你应该使用构造函数注入而不是属性(或方法)注入。
所以这基本上意味着您需要WhenInjectedInto<>
和WhenAnyAncestorMatches
的组合。您可以查看WhenInjectedInto<>
here的实现,并使用相同的逻辑作为WhenAnyAncestorMatches
的参数,或者您可以使用一些有点肮脏的技巧来结合两者:
var binding = Kernel.Bind<AnObject>().ToConstructor(..);
Func<IRequest, bool> whenInjectedIntoCondition =
binding.WhenInjectedInto<int>().BindingConfiguration.Condition;
binding.WhenAnyAncestorMatches(c => whenInjectedIntoCondition(c.Request));
使用构造函数注入时,如果它也适用于属性注入,我不能100%确定。