命名复杂类型

时间:2019-12-12 11:21:51

标签: c# class type-declaration

我正在寻找一种用简单名称命名复杂类型的方法。 例子

代替

Dictionary<string,List<Dictionary<string,string>>> myvar = ...

只要做一些魔术,我就可以将myvar定义为

MyNewType myvar = new MyNewType()
myvar = ....

我总能做到

class MyNewType{
   public  Dictionary<string,List<Dictionary<string,string>>> myvar ;
}

但是我需要输入

MyNewType myType = new myNewVar();
myNewVar.myvar = ....

每次引用myvar都需要一个虚拟myNewVar

致谢

2 个答案:

答案 0 :(得分:2)

我能给您的最好的提示-尽管不会回答您的问题被发布-是:请勿这样做。不要试图将复杂的数据结构转换成Dictionary这样的简单数据。通常,在设计此类概念时,您会想到某种数据表。该表本身没有任何意义,因此您会认为:我的表具有许多属性。因此,我有一本字典,其键是字符串-这些属性的名称。而且这些属性可以出现多次,因此它本身就是一个列表。这个概念不断发展壮大,最终您将陷入一个庞大的列表和地图系统,这些列表和地图无法维护,因为没人会确切地知道在编写myType.MyVar["Attribute"][1]["AnotherAttribute"]时实际上要引用的实体模型的哪一部分。乍一看似乎很聪明,但是随着您需求的变化-他们会-这将成为维护方面的噩梦。假设您得到一个实际上是数字类型的新属性。但是,您的字典仅由字符串和其他列表组成,根本没有空格可容纳数字。因此,您将您的数字以字符串的形式存储在星期中,这会导致许多麻烦的转换工作,例如ToString,然后返回int

那还有什么呢?我在上面描述了一个实体模型。您要记住一组表,其中每个表都有一组属性。因此,让我们特定哪些属性?他们有哪些类型?以及如何在该表中找到实体的通用名称?一旦回答了这些问题,您便具有易于理解和易于扩展的类结构。例如。 Car确实具有* Wheel s, usually four. So you have a列表here. Maybe it also has some creator, e.g BMW or Mercedes , those are pretty sure string-attributes. And it may have a creation-date, which is a Date`。因此,您的课程如下所示:

class Car
{
    public string Creator { get; set; }
    publi Date CreationDate { get; set; }
    public List<Wheel> Wheels { get; set; }
}

另一方面,wheel可以有一个Size。这可能是一些数字格式。因此,而不是像这样的字典:

myCar["Wheels"][2]["Size"] // hmmm, what type is Size? a double? an int? 

您知道有一种更简单的方法:

myCar.Wheels[2].Size // nice, we have a double at compile-time. 

答案 1 :(得分:0)

通常,如果要命名概念,则应将其命名为class(在某些情况下为struct)。特别是对于像嵌套字典这样看似复杂的结构。在大多数情况下,此类结构具有固有的其他逻辑,最好将其建模为自己的类型。

如果您完全确信需要新的“类型”,则可以随时为文件定义别名:

using MyType = Dictionary<string,List<Dictionary<string,string>>>;

这与您要使用此别名的每个文件顶部的所有其他using一起使用。请注意,从“外部”开始,该别名将是未知的。这样的方法

public MyType DoStuff(){ ... }

仍将显示为

public Dictionary<string,List<Dictionary<string,string>>> DoStuff()

用于所有使用代码。