我有一个名为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委托现在可以将实现细节泄漏给最终用户,因为他们可以观察到该方法是TryGetValueDictionary<PropertyInfo,string>方法,而目标将是私有字典。您会认为这是代码气味吗?

我可以将其包装在匿名方法中,但是当可以进行方法组转换时,我倾向于考虑使用这种不良形式。

最佳答案

查看Map委托的目标和方法所涉及的工作量与反映MapBuilder类本身的字段所涉及的工作量大致相同。无论哪种方式,调用者都可以发现私有Dictionary实例。

MapBuilder类的角度来看,我不必担心。在私有字段上进行反思肯定是代码的味道:但这不是您的责任,而是您班级用户的责任。

10-08 07:26