假设我有一个具有多个与用户定义参数对应的属性的类,例如:
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 中的属性(例如,通过将它们子类化为逻辑组);但我无法似乎无法理解的是,如何以一种易于维护的方式提供完整的所需功能。
所需的功能是:能够显示所选实例的所有用户定义参数,选择要复制的属性,并将仅选定属性的值从一个实例复制到另一个实例。通过为这些属性使用可枚举接口,这变得非常简单 - 添加新参数就像将其添加到字典一样简单。否则,不使用反射,我很难看到它。
想想看,也许我应该为所有这些使用强类型数据集......
答案 0 :(得分:2)
我从来没有真正做到这一点,但我想你可以使用Reflection的GetProperties()迭代一个类的属性。
它为您提供了一个可以使用的PropertyInfo对象数组。
http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx
编辑:刚注意到'没有反射'位。为什么没有反思?如果你没有任何硬限制,这可能比复杂的多字典解决方案更好..
答案 1 :(得分:0)
如果确实数百个这些属性,我认为无论如何都要实现它们。
假设这些属性没有任何特定的东西,我实际上也会考虑一种更通用的方法来处理这个问题,你建议的并不是那么糟糕 - 即使它是非常规的。但拥有数百处房产也是非常规的。
答案 2 :(得分:0)
如果我完全明白你的意思,我认为最好使用一组参数定义。像这样:
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接口,以便从参数中轻松复制。