为什么继承的字段不属于最终类型

Why an inherited field does not belong to the final type

我有以下代码

public abstract class Parent
{
    AnObject AProperty {get; set;}
}
public class ChildA : Parent { }
public class ChildB : Parent { }

当我通过反射访问 ChildA 的实例时,我看到它的成员 AProperty 的 DeclaringType 等于 Parent。遗憾的是,我想依靠反射来确定谁是 ChildA,谁是 ChildB。

More context :我实际上是在尝试通过 NInject 将 AProperty 与 when 子句绑定,以便它根据实际类型进行不同的解析要创建的对象。这是一个过于简单的例子:

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))

问题

如果我没看错,你想将不同的 AnObject 注入到 属性 AProperty 中,具体取决于注入哪个子 class。


提示:如果没有令人信服的理由不这样做,您应该使用构造函数注入而不是 属性(或方法)注入。


所以这基本上意味着您需要 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% 确定它是否也适用于 属性 注入。