我有一个名为MapBuilder<T>
的类,该类在内部使用Dictionary<PropertyInfo,string>
该类用于快速建立将要代理的属性的映射。
该类如下所示:
public class MapBuilder<T>{
private Dictionary<PropertyInfo, string> m_Map = new Dictionary<PropertyInfo,string>();
public MapBuilder<T> Add<TProperty>(Expression<Func<T, TProperty>> property){
ArgumentValidator.AssertIsNotNull(()=>property);
var propertyInfo = Reflect.Property<T>.InfoOf(property);
m_Map.Add(propertyInfo, propertyInfo.Name);
return this;
}
public MapBuilder<T> Add<TProperty>(Expression<Func<T, TProperty>> property,string columnName){
ArgumentValidator.AssertIsNotNull(() => property);
ArgumentValidator.AssertIsNotNull(() => columnName);
var propertyInfo = Reflect.Property<T>.InfoOf(property);
m_Map.Add(propertyInfo, columnName);
return this;
}
public Map Compile(){
return m_Map.TryGetValue;
}
因此用户可以像这样使用它:
var map= new MapBuilder<MyClass>()
.Add(x => x.Name)
.Add(x => x.Id)
.Add(x => x.Active)
.Compile()
这将构建一个映射,其中包含Name,Id,Active的3个属性。问题在于
Map
委托现在可以将实现细节泄漏给最终用户,因为他们可以观察到该方法是TryGetValue
的Dictionary<PropertyInfo,string>
方法,而目标将是私有字典。您会认为这是代码气味吗?我可以将其包装在匿名方法中,但是当可以进行方法组转换时,我倾向于考虑使用这种不良形式。
最佳答案
查看Map
委托的目标和方法所涉及的工作量与反映MapBuilder
类本身的字段所涉及的工作量大致相同。无论哪种方式,调用者都可以发现私有Dictionary
实例。
从MapBuilder
类的角度来看,我不必担心。在私有字段上进行反思肯定是代码的味道:但这不是您的责任,而是您班级用户的责任。