【问题标题】:Representing "comboboxes" in C#在 C# 中表示“组合框”
【发布时间】:2017-12-15 14:26:38
【问题描述】:

我必须做一个有几个组合框的表格。 组合框的值表示为键-描述对。

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

如何在类中表示它?
假设我们有 ProjectTypeTechnology)作为“枚举”,每个它们在数据库中的类型和技术表中(因此其数量取决于数据库中的行数)

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;}
}

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

【问题讨论】:

  • 你在使用 WPF 吗?我不清楚你在问什么。
  • 我使用“ASP.NET Core”Web 应用程序,我问我是否应该将 KeyValuePair 分离到单独的类中
  • 所有类型和技术都已知吗?我的意思是,类型和技术的数量是静态的,还是说你今天可能有 5 种类型,明天可能有 10 种?有人可以添加新的类型或技术吗?
  • 技术是数据库中的一个表......所以这取决于里面有多少行
  • 是的,引用你的话“假设我们有项目(类型和技术)作为“枚举”,那么行数是固定的,对吧?既然枚举长度是固定的

标签: c# combobox


【解决方案1】:

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

那为什么不使用枚举呢?

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;

(我从here 获得此代码,其中还显示了在您使用 EF 作为 ORM 的情况下如何将枚举映射到表)

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

假设类型和技术可能会增长或变化,而您遵循第一种方法。那么你就违反了S,因为如果类型或技术的定义发生变化,你的项目类可能会发生变化。假设将来您意识到您必须支持多种语言(eng、esp、ita 等),那么您就违反了 O,因为类型和技术的定义不能再由 KeyValuePair 表示你将不得不弄清楚如何实现这一点,最糟糕的是,你将不得不修改不应关心这个的 Project 类。

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

【讨论】:

  • 谢谢。正如您所言,“key”是字符串类型......我的键可以是“0”、“1”、“A”、“kjsdhfjh”等......所以经典枚举在这里不起作用......另一件事是它们来自数据库,因此项目的数量可能会有所不同
  • 然后可以使用枚举值的名称作为key:enumVal.ToString();或者int的字符串表示:((int)enumVal).ToString|();
  • 但是如果枚举不够合适,那么我推荐第一种方法,原因是我上面写的 =)
  • “枚举”中的项目数不固定,键可以是随机(唯一)字符串,int 值只是偶尔使用...
  • 我推荐第二种方法,我在上一条评论中写错了第一种方法
【解决方案2】:

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

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

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

希望这是您需要的答案。

附:你的意思很清楚,但你忘了删除'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;}

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多