FieldInfo.SetValue() 私有成员怎么也能赋值.这不违反OO原则么?
建议你贴上具体代码会好点。关于类私有成员,可以通过它提供的成员函数接口来操作私有成员,这是oo原则里允许的。
_subRoutes这个是私有字段,如果FieldInfo.SetValue可以给它赋值,那么它跟公有字段有什么区别?而且属性封装也貌似没用。
@紫陌轻风: 所谓封装,在于外界只能通过已提供的接口来访问或操作它,而不能直接操作其本身。说明白点就是,公有字段,你可以直接用.操作符来赋值,不需要调用函数,而私有字段,不可以用.来访问。如果你不喜欢私有字段被访问,就不设定接口,那么封装性就很好啊,外界没有办法操作它。
@jiu~: 这些我知道,但是我不明白FieldInfo.SetValue()为什么可以给私有字段赋值
@紫陌轻风: 那么FieldInfo.SetValue()是用来干嘛的呢?如果是你,你会用什么方法去给它赋值呢?
@jiu~: 反射我也不是很明白,但是按我原来对OOP的理解,私有字段是不允许外界修改和访问的,但是FieldInfo.SetValue()就把我搞晕了。
@紫陌轻风: 私有成员的特点在于访问等操作被设置了限制 并不是必须封死了 这个看笔者意愿 建议你自己试试写一些简单例子理解下 这个是概念问题 你好好理解一下 加油
虽然说要讲原则,但是也不能不通人情啊。
从你贴的代码里已经看到了,你取FieldInfo的时候,BindingFlags是Instance和NonPublic,当然可以取出私有字段。
反射主要用于操作托管模块中的元数据,通过反射可以提供元数据中的类型信息,使得开发人员能够在运行时利用这些信息。
总结来说就是反射和OO没有直接的关系,面向对象和操作元数据是两个维度的事情。