为什么继承的字段不属于最终类型
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))
问题:
- 我是不是做错了什么?
- 我是否必须将
AProperty
设置为 abstract
并在每个 ChildX
上覆盖它?
- 我可以在
WhenAnyAncestorMatches
谓词中获取实际类型吗?
如果我没看错,你想将不同的 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% 确定它是否也适用于 属性 注入。
我有以下代码
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))
问题:
- 我是不是做错了什么?
- 我是否必须将
AProperty
设置为abstract
并在每个ChildX
上覆盖它? - 我可以在
WhenAnyAncestorMatches
谓词中获取实际类型吗?
如果我没看错,你想将不同的 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% 确定它是否也适用于 属性 注入。