为了账号安全,请及时绑定邮箱和手机立即绑定

C# 强类型属性

C# 强类型属性

C#
慕虎7371278 2023-09-24 10:43:08
我发布了一个问题,但需要澄清。我是初学者。我不确定在这种情况下使用术语“强类型属性”意味着什么?我原来的帖子的响应者提供的语法正是我所追求的,但是当我在网络上搜索这个术语时,它只提供了定义和示例,而不提供有关如何在用户定义的类中实现它的有用示例。这不是最好使用强类型属性(例如 h.Segments["PID"].Fields[5].Subfields[3].SubSubFields[2])吗?– Lasse Vågsæther Karlsen 8 月 19 日 7:25总的来说,我的目标是解析包含许多消息的文本文件循环遍历每个消息文本(FS 分隔)并从该文本创建单个消息对象。这些消息中的每一条都...一个或多个消息段具有一个或多个字段具有零个或多个子字段零个或多个子子字段我理想地想创建和对象像HL7Message h = new HL7Message; string name = h.segment[2].field[5].subfield[0];如何创建和访问其属性本身具有属性的对象?
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

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


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

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


查看完整回答
反对 回复 2023-09-24
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

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


注意:下面类中的构造函数确保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)、匿名对象等来执行这些约定。


查看完整回答
反对 回复 2023-09-24
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信