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设置为抽象并在每个ChildX上覆盖它?
>我可以在WhenAnyAncestorMatches谓词中获得实际类型吗?
提示:如果没有令人信服的理由不这样做,你应该使用构造函数注入而不是属性(或方法)注入.
所以这基本上意味着你想要一个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%确定它是否也适用于属性注入.
总结以上是内存溢出为你收集整理的c# – 为什么继承的字段不属于最终类型全部内容,希望文章能够帮你解决c# – 为什么继承的字段不属于最终类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)