C# 强类型属性
C# strongly typed properties
我发布了一个问题但需要澄清。我是初学者。
我不确定 "strongly typed properties" 一词在这种情况下是什么意思? syntax offered by the responder to my original post 是我所追求的,但是当我在网上搜索这个术语时,它只提供了一个定义和示例,而不是关于如何在用户定义的 类.[=13= 中实现它的有用示例]
Wouldn't this be best served with strongly typed properties, like
h.Segments["PID"].Fields[5].Subfields[3].SubSubFields[2]? – Lasse
Vågsæther Karlsen Aug 19 at 7:25
总的来说,我的目标是
- 在包含许多消息的文本文件中解析
- 遍历每个消息文本(FS 分隔符)并从该文本创建单个消息对象。这些消息中的每一条都有...
- 一个或多个消息片段
- 一个或多个字段具有
- 零个或多个具有
的子字段
- 零个或多个子字段
理想情况下,我想创建和反对
HL7Message h = new HL7Message;
string name = h.segment[2].field[5].subfield[0];
如何创建和访问其属性本身具有属性的对象?
你真是想多了。强类型只意味着(在这种情况下),你有 classes 明确表达自己。这实际上只是底层面向对象编程。
即Segment
是一个class,Field
是一个class, 具有简单类型和其他强类型 classes 等的属性
如果您需要段中的更多信息,只需向其中添加更多属性等即可。
给定
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];
注意:这不是要构建您的应用程序,只是解决您对许多问题的困惑。
另一种可能且更简洁的方法可能是将其简化为自引用 class 或节点模型(即 XML 或相同的 Field
class @TheGeneral 在他们的例子中有)如果你愿意的话,你可以在其中有子子子子子子......字段。每个节点都是相同的(即可预测的),具有相同级别的功能支持。
注意:下面class中的构造函数确保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
)、匿名对象等
我发布了一个问题但需要澄清。我是初学者。
我不确定 "strongly typed properties" 一词在这种情况下是什么意思? syntax offered by the responder to my original post 是我所追求的,但是当我在网上搜索这个术语时,它只提供了一个定义和示例,而不是关于如何在用户定义的 类.[=13= 中实现它的有用示例]
Wouldn't this be best served with strongly typed properties, like h.Segments["PID"].Fields[5].Subfields[3].SubSubFields[2]? – Lasse Vågsæther Karlsen Aug 19 at 7:25
总的来说,我的目标是
- 在包含许多消息的文本文件中解析
- 遍历每个消息文本(FS 分隔符)并从该文本创建单个消息对象。这些消息中的每一条都有...
- 一个或多个消息片段
- 一个或多个字段具有
- 零个或多个具有 的子字段
- 零个或多个子字段
理想情况下,我想创建和反对
HL7Message h = new HL7Message;
string name = h.segment[2].field[5].subfield[0];
如何创建和访问其属性本身具有属性的对象?
你真是想多了。强类型只意味着(在这种情况下),你有 classes 明确表达自己。这实际上只是底层面向对象编程。
即Segment
是一个class,Field
是一个class, 具有简单类型和其他强类型 classes 等的属性
如果您需要段中的更多信息,只需向其中添加更多属性等即可。
给定
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];
注意:这不是要构建您的应用程序,只是解决您对许多问题的困惑。
另一种可能且更简洁的方法可能是将其简化为自引用 class 或节点模型(即 XML 或相同的 Field
class @TheGeneral 在他们的例子中有)如果你愿意的话,你可以在其中有子子子子子子......字段。每个节点都是相同的(即可预测的),具有相同级别的功能支持。
注意:下面class中的构造函数确保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
)、匿名对象等