【问题标题】:C# strongly typed propertiesC# 强类型属性
【发布时间】:2019-12-30 06:42:24
【问题描述】:

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

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

这不是最好使用强类型属性吗,例如 h.Segments["PID"].Fields[5].Subfields[3].SubSubFields[2]? – 拉斯 Vågsæther Karlsen 8 月 19 日 7:25

总的来说,我的目标是

  1. 解析包含许多消息的文本文件
  2. 遍历每个消息文本(FS 分隔)并从该文本创建单个消息对象。这些消息中的每一条都...
  3. 一个或多个消息段
  4. 一个或多个字段
  5. 零个或多个子字段
  6. 零个或多个子域

理想情况下,我希望像这样创建和对象

HL7Message h = new HL7Message;

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

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

【问题讨论】:

  • 你的问题我不清楚。能不能简单解释一下?
  • 您在使用 HL7v2 解析器吗?

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


【解决方案1】:

你真的想多了。强类型仅意味着(在这种情况下),您有明确表达自己的类。这实际上只是底层的面向对象编程。

Segment是一个Field是一个,它们具有简单类型和其他强类型类等的属性。

如果您需要更多细分信息,只需向其中添加更多属性等。

给定

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

注意:这不是试图构建您的应用程序,只是解决您对许多问题的困惑。

【讨论】:

    【解决方案2】:

    另一种可能且稍微干净的方法可能是将其简化为自引用类或节点模型(即 XML 或相同的 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 消息交换的命名约定要求是什么,但也许仍有一些机会使用序列化装饰器(即Newtonsoft.Json.JsonPropertyAttribute)、匿名对象等来执行那些约定。

    【讨论】:

    • 简洁的方法和良好的学习体验。感谢分享
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2017-01-13
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多