繁体   English   中英

在C#中表示“组合框”

[英]Representing “comboboxes” in C#

我必须做一个表格,里面有几个组合框。 组合框的值表示为“键描述”对。

每个组合框在单独的表中都有其值Key<string> Value<string>

如何在课堂上表现出来?
假设我们将Project类型技术 )作为“枚举”,它们每个都在数据库的Type和Technology表中(因此其数量取决于数据库中的行数)

class Project {
    public int Id {get; set;}
    public KeyValuePair<string, string> Type {get; set;}
    public KeyValuePair<string, string> Technology {get; set;}
}

或更好

class ProjectType { public string Key; public string Value; }
class ProjectTechnology { public string Key; public string Value; }

class Project {
    public int Id {get; set;}
    public ProjectType Type {get; set;}
    public ProjectTechnolgy Technology {get; set;}
}

从关注点分离的角度来看,我们可能应该使用第二种变体,但是如果我们可以像第一种变体那样简单地做,那么为什么要复杂化呢?

假设我们将项目(类型和技术)作为“枚举”,每个都在数据库的类型和技术表中

那为什么不使用枚举呢?

public enum ProjectType
    {
        [Description("Friendly name for type 1")]
        Type1,
        [Description("Friendly name for type 2")]
        Type2,
        [Description("Friendly name for type 3")]
        Type3
    }

并使用如下扩展方法,可以获取给定枚举值的描述​​:

public static string GetEnumDescription<TEnum>(this TEnum item)
        => item.GetType()
               .GetField(item.ToString())
               .GetCustomAttributes(typeof(DescriptionAttribute), false)
               .Cast<DescriptionAttribute>()
               .FirstOrDefault()?.Description ?? string.Empty;

(我从这里获得了此代码,还展示了如何在将EF用作ORM的情况下将枚举映射到表)

Description属性可以用作组合框内的显示字符串。 如您所说,如果值是固定的,如果值不是固定的或者它们可能增长或更改,则这种方法有效,那么我想说第二种方法(创建单独的类)最好遵循SOLID最佳做法,在这种情况下,第二种方法在整体上违反了OS开放式封闭原则单一责任原则 (更多关于SOLID )。

假设类型和技术可能会增长或改变,而您会遵循第一种方法。 然后您违反了S,因为现在如果Type或Technology的定义更改,您的Project类可能会更改。 假设将来您意识到自己必须支持多种语言(例如eng,esp,ita等),则您违反了O,因为Type和Technology的定义不再可以用KeyValuePair表示,因此您必须弄清楚如何实现这一目标,最糟糕的是,您将不得不修改Project类,而无需对此进行任何考虑。

但是,如果它们是固定值,则枚举方法会更好,因为它强制使用始终已知的值,因此您不可能将不存在的类型或技术分配给项目。

这是意见和编码风格的问题,但这是我的看法:

第一个选项(简单的KeyValuePair)是更少的代码,但这并不一定使它更简单。 第二个选项(创建代表ProjectType和ProjectTechnology的类)更好,因为它更容易阅读。

进一步的改进(我再次认为)将不会将这两个类的属性命名为“键”和“值”。 当然,这些属性表示的内容比键和值更具体吗? 相应地命名,使其他人更容易理解他们代表的内容。

希望这是您需要的答案。

PS,您写的意思很清楚,但是您忘了删除其中的“ int”

public int KeyValuePair<string, string> Type {get; set;}
public int KeyValuePair<string, string> Technology {get; set;}

 public int ProjectType Type { get; set;}
 public int ProjectTechnolgy Technology { get; set;}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM