【问题标题】:Could it be a good idea to put Properties into Dictionaries?将属性放入字典是否是个好主意?
【发布时间】:2010-12-11 06:46:00
【问题描述】:

假设我有一个类有几个属性对应用户定义的参数,比如:

bool StepUpHedge { get; set; }
bool PullOnJump { get; set; }
bool PullOnCross { get; set; }
double MaxStockSpread { get; set; }
double MaxHedgeSpread { get; set; }

(这些只是示例,不是真正的代码,无论如何它们的含义并不重要。)

现在,假设实际上有几十个甚至数百个这些用户定义的参数。处理保存/加载和(最重要的是)将所有或部分从类的一个实例复制到另一个实例可能非常麻烦。

显然,我不想只创建一个 Dictionary<Parameter, object> 来存储它们(类型安全?拳击?那是什么?),但是能够枚举会很好越过它们(没有反射),这让我想知道......

如果我制作了几本字典会怎样:

public enum BoolParameter { /*...*/ }
public enum DoubleParameter { /*...*/ }
public enum IntParameter { /*...*/ }
Dictionary<BoolParameter, bool> BoolParameters { get; set; }
Dictionary<DoubleParameter, double> DoubleParameters { get; set; }
Dictionary<IntParameter, int> IntParameters { get; set; }

我知道这看起来很可疑,并且有更简洁的方法来处理 general 中的属性(例如,通过将它们子类化为逻辑组);但我似乎无法想到的是如何以易于维护的方式提供所需的全部功能。

所需的功能是:能够显示选定实例的所有用户定义参数,选择要复制的属性,以及仅将那些选定属性的值从一个实例复制到另一个实例。通过为这些属性使用可枚举的接口,这变得非常简单——添加新参数就像将其添加到字典中一样简单。否则,如果不使用反射,我很难看到它。

想一想,也许我应该为所有这些使用强类型数据集...

【问题讨论】:

  • 为什么没有反思?您可以将属性添加到给定的属性,并结合反射枚举它们。
  • 我同意 Am - 反射“慢”,但只有在创建或复制数百/数千个对象时才会真正出现。

标签: .net dictionary properties


【解决方案1】:

我实际上从未这样做过,但我想您可以使用 Reflection 的 GetProperties() 迭代类的属性。

它为您提供了一组 PropertyInfo 对象供您使用。

http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx

编辑:刚刚注意到“没有反射”位。为什么没有反思?如果您没有任何硬性限制,这可能比复杂的多字典解决方案要好..

【讨论】:

    【解决方案2】:

    如果真的有数百个这样的属性,我认为无论如何实现它们都是不切实际的。

    假设这些属性没有任何特定的东西,我实际上也会考虑一种更通用的方法来处理这个问题,而且你的建议并不是那么糟糕——即使它是非常规的。但是拥有数百个属性也是非常规的。

    【讨论】:

      【解决方案3】:

      如果我能完全理解你的意思,我认为最好使用参数定义的集合。像这样的:

      public class ParameterInfo : IClonabe
      {
          public string ParameterName { get; set; }
          public Type ParameterType { get; set; }
          public object Value { get; set; }
      }
      

      还有一个班级:

      public class UserParameters : IClonabe
      {
          public IEnumerable<ParameterInfo> Parameters { get; set; }
      }
      

      使用这个模型是可以接受的,因为参数不是永久的。您可以实现 IClonable 接口,以便从您的参数中轻松复制。

      【讨论】:

        猜你喜欢
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多