我正在为一个名为Fasterflect的库做出贡献,其目的是“改善使用反射的开发人员体验”。因此,它提供了一个建立在经典反射之上的抽象,并将在完全相同的场景中使用。
以下显示了通过对象实例访问成员的当前语法:
obj.SetPropertyValue( "PropertyWithPrivateSetter", "foo" );
obj.SetFieldValue( "_readOnlyIntegerProperty", 123 );
一位用户建议我们添加对基于lamdba的访问的支持(类似于Fluent Hibernate):
obj.SetPropertyValue<MyClass>( x => x.PropertyWithPrivateSetter, "foo" );
obj.SetFieldValue<MyClass>( x => x.ReadOnlyInteger, Access.CamelCaseField(Prefix.Underscore), 123 );
我很难想到这会有用的场景,因为反射通常是在编译时不了解的类型上执行的。我只是缺乏想象力吗?在编译时你知道类型的反射是否有有效的场景?
this NBuilder feature request上的原始建议还有一些其他背景信息,您还可以查看Fasterflect feature request。
答案 0 :(得分:3)
主要使用场景将是您描述的场景:具有公共getter但属于私有setter的属性。通过使用lambda表达式,您可以提供属性名称的编译时检查(即:没有魔术字符串),但仍然提供了一种通过反射设置“只读”属性的方法。
答案 1 :(得分:0)
要扩展Reed所说的内容(谁说它比我输入的更简洁)一个非常有效的方案就是“只读工厂”,这些工厂生成包装器,提供真正的只读上下文或提供set-只读对象并避免构造函数设置(即真正的密封类)。