我的应用程序的前端是DataGrid
,其内容将传递给Excel生成方法。
问题是DataGrid处理13列:其中10列是固定的(即传递给Excel),而最后3列中的每一列都是可选的。
public class GridModel
{
public string Item { get; set; }
public string ItemName { get; set; }
public double TotalHeight { get; set; }
public double AGLheight { get; set; }
public double Embedment { get; set; }
public string Shape { get; set; }
public double TipDiameter { get; set; }
public double BaseDiameter { get; set; }
public double Taper { get; set; }
public double ShearReaction { get; set; }
// The following are optional, in 8 combinations, from all present to all absent
public double Camber { get; set; }
public double Rake { get; set; }
public double Angle { get; set; }
}
作为C#新手,我正在考虑不同的方法。
你们会怎样处理这个问题?想到的最简单的想法是在模型中添加3个标志:
bool IsColumn1Present;
bool IsColumn2Present;
bool IsColumn3Present;
另一种方法是在层次结构中添加一个级别,因此每个“特殊”列都包含自己的嵌入式标志:
if (Camber.flag) add(Camber.value);
那就是说,我希望能够以某种方式删除这3个属性,因此任何访问它们的尝试都会导致错误或不可能。
如果存在这样的事情,我猜它会被称为“Variant Properties”。
TIA
注意:我已经通过在GUI级别操作Visibility.Visible
字段解决了这个问题。然而,大师告诉我们这是一个坏主意。最佳实践要求此工具应成为模型的一部分。
答案 0 :(得分:2)
如果列数是常量(意味着用户无法添加'自定义'列),我建议使用位字段enum
,如下所示:
[Flags]
public enum ColumnFlags
{
None = 0,
Camber = 0x1,
Rake = 0x2,
Angle = 0x4,
// Other optional columns here, keep them powers of 2!
}
然后在Model
课程中,保留一个值,例如:
public ColumnFlags ColumnFlags { get; set; }
然后你可以使用......
if(model.ColumnFlags.HasFlag(ColumnFlags.Camber))
{
// Do something here...
}
if(model.ColumnFlags.HasFlag(ColumnFlags.Rake))
{
// Do something here...
}
编辑或者,您可以使用Nullable<T>
类型指定“缺失”或“空”值。
答案 1 :(得分:2)
您可以使用可空属性:
public double? Camber { get; set; }
然后检查他们的业务逻辑中的值:
if (thing.Camber.HasValue)
{
DoSomething(thing.Camber.Value);
}
听起来这可能正是您所追求的,因为您对“变体”属性发表评论。
更多信息:http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx
更新:如果您需要在应用程序范围内关闭它们(根据您的评论),您可以避免在不需要时将值设置在第一位(这是优选的,因为这是,就我而言关注,业务逻辑,不属于您的愚蠢模型类)或使用自定义访问器扩展它:
private double? _camber;
public double? Camber
{
get
{
return ModelSettings.CamberEnabled
? _camber
: null;
}
set;
}
然后在某处有一些静态/常量属性:
public static class ModelSettings
{
public const bool CamberEnabled = true;
}