C#强类型属性

时间:2019-08-26 04:21:20

标签: c# object data-modeling hl7-v2

我发布了一个问题,但需要澄清。我是初学者。

在这种情况下,我不确定“强类型属性”一词的含义是什么? syntax offered by the responder to my original post是我所追求的,但是当我在网上搜索该术语时,它仅提供了定义和示例,而没有提供有关如何在用户定义的类中实现的有用示例。

  

这是否最好与强类型属性一起使用,例如   h.Segments [“ PID”]。Fields [5] .Subfields [3] .SubSubFields [2]? –拉瑟   VågsætherKarlsen 8月19日7:25

总体而言,我的目标是

  1. 解析包含许多消息的文本文件
  2. 循环遍历每个消息文本(已删除FS),并从该文本创建单个消息对象。每个消息都有...
  3. 具有一个或多个消息段的
  4. 一个或多个具有
  5. 的字段
  6. 零个或多个具有
  7. 的子字段
  8. 零个或多个子子字段

理想情况下,我想创建和对象类似

HL7Message h = new HL7Message;

string name = h.segment[2].field[5].subfield[0];

如何创建和访问其属性本身具有属性的对象?

2 个答案:

答案 0 :(得分:3)

您真的在考虑这个问题。在这种情况下,强类型仅表示您拥有明确表示自己的类。这实际上只是底层的面向对象编程。

SegmentField class ,具有简单类型和其他强类型类的属性,例如

如果您需要细分的更多信息,只需向其添加更多属性,依此类推

给出

public class HL7Message
{
   public List<Segment> Segments { get; set; }
}

public class Segment
{
   public string Name { get; set; }
   public List<Field> Fields { get; set; }
}

public class Field
{
   public string Name { get; set; }
   public List<Field> Fields { get; set; }
}

设置

var message = new HL7Message()
        {
           Segments = new List<Segment>()
                {
                   new Segment()
                   {
                      Name = "PID",
                      Fields = new List<Field>()
                         {
                            new Field()
                            {
                               Name = "SomeField",
                               Fields = new List<Field>()
                                  {
                                     new Field()
                                     {
                                        Name = "SomeSubField",
                                        Fields = new List<Field>()
                                           {
                                              new Field()
                                              {
                                                 Name = "SomeSubSubField",
                                              }
                                           }
                                     }
                                  }
                            }
                         }
                   }
                }
        };

用法

var someResult = message.Segments[1].Fields[1].Fields[1];

注意 :这并不是要构建您的应用程序,而只是解决您在许多问题上遇到的困惑

答案 1 :(得分:1)

另一种可能且更简洁的方法可能是将其简化为自引用类或节点模型(例如,XML或示例中@TheGeneral的同一Field类@TheGeneral),在其中您可以有sub-sub -sub-sub-sub ...字段,如果需要的话。这样,每个节点都是相同的(即可预测的),并且具有相同级别的功能支持。

注意:下列类中的构造函数确保始终初始化Children属性,以避免处理空值。

using System;
using System.Collections.Generic;

public class HL7Node
{
    public IDictionary<string, object> Fields {get; set; }
    public List<HL7Node> Children { get; set; }

    public HL7Node() 
    {
        Children = new List<HL7Node>();
    }
}

用法示例(另请参见https://dotnetfiddle.net/EAh9iu):

var root = new HL7Node {
  Fields = new Dictionary<string, object> {
    { "fname", "John" },
    { "lname", "Doe" },
    { "email", "jdoe@example.com" },
  },
};

var child = new HL7Node {
  Fields = new Dictionary<string, object> {
    { "fname", "Bob" },
    { "lname", "Doe" },
    { "email", "bdoe@example.com" },
  },
};

var grandChild = new HL7Node {
  Fields = new Dictionary<string, object> {
    { "fname", "Sally" },
    { "lname", "Doe" },
    { "email", "sdoe@example.com" },
  },
};

var greatGrandChild = new HL7Node {
  Fields = new Dictionary<string, object> {
    { "fname", "Ray" },
    { "lname", "Doe" },
    { "email", "rdoe@example.com" },
  },
};

root.Children.Add(child);
root.Children[0].Children.Add(grandChild);
root.Children[0].Children[0].Children.Add(greatGrandChild);
var message = string.Format("Grandchild's name is {0}", root.Children[0].Children[0].Fields["fname"]);

我不知道您的HL7消息交换的命名约定要求是什么,但是也许仍有一些机会仍然可以使用序列化 decorators (即Newtonsoft.Json.JsonPropertyAttribute),匿名对象,等