最佳实践是创建一个反映并生成序列化字符串的C#对象

最佳实践是创建一个反映并生成序列化字符串的C#对象,c#,coding-style,C#,Coding Style,这个问题以前可能被问过或回答过,但我觉得没有一个答案是正确的 我想创建一个带有属性的小类,这些属性将对应于xml流所熟悉的输出中的名称和属性。该类应该帮助程序创建类似xml的字符串 string test = "<graph caption='SomeHeader' attribute9='#someotherinfo'>" + "<set name='2004' value='37800' color='AFD8F8' />" +

这个问题以前可能被问过或回答过,但我觉得没有一个答案是正确的

我想创建一个带有属性的小类,这些属性将对应于xml流所熟悉的输出中的名称和属性。该类应该帮助程序创建类似xml的字符串

string test = "<graph caption='SomeHeader' attribute9='#someotherinfo'>" +
                 "<set name='2004' value='37800' color='AFD8F8' />" +
                 "<set name='2005' value='21900' color='F6BD0F' />" +
                 "<set name='2006' value='32900' color='8BBA00' />" +
                  "<set name='2007' value='39800' color='FF8E46' />" +
              "</graph>";
string test=“”+
"" +
"" +
"" +
"" +
"";
我想你明白了。我有一个静态数量的已知属性,将在标签中使用。这里唯一的标记是setgraph

我想做这样的事情

Helper o = new Helper()
List<Tag> tag = new List<Tag>();
foreach (var someitem in somedatabaseresult)
{
   tag.Add(New Graph() { Caption = someitem.field , attribute9 = someitem.otherField });
   foreach (var detail in someitem)
   {
     tag.Add(new Set() { name = detail.Year, value = detail.Value color = detail.Color });
   }
}
o.Generate(); // Which will create the structure of result sample above

// and for future extension.. 
// o.GenerateXml();
// o.GenerateJson();
Helper o=newhelper()
列表标记=新列表();
foreach(变量somedatabaseresult中的someitem)
{
Add(New Graph(){Caption=someitem.field,attribute9=someitem.otherField});
foreach(someitem中的var详细信息)
{
添加(新集合(){name=detail.Year,value=detail.value color=detail.color});
}
}
o、 生成();//这将创建上述结果样本的结构
//为了将来的扩展。。
//o.GenerateXml();
//o.GenerateJson();
请记住,这个代码是pesudo,刚从我头上取下来的。因此,我有了一些想法,但需要一天的时间来编写和测试最好的(或者说最好的)

解决此任务的最佳实践是什么

[编辑]
这个神秘的“助手”(Helper)是(不幸键入的)类,它包含图形列表、集合列表,并且(我所想的)还包含每个图形/集合对象的所有可用属性。上面提到的foreach循环的工作是用数据填充Helper类

[编辑二] 结果在这里,

使用。

使用。

为什么不创建两个类:Graph和Set。图形的属性为
List

然后,您可以在
foreach
中创建实例或图形,并将集合的实例添加到其列表中

完成后,使用XML序列化程序将图形对象序列化为XML。如果您以后需要更改,例如序列化为JSON,那么也可以轻松地输出到另一种格式

编辑以下评论:

从我的头上看可能不是100%正确

var myGraph = BuildMeAGraph();
var serializer = new XmlSerializer(typeof(Graph));
var writer = XmlWriter.Create("myfile.xml");
serializer.Serialize(writer, myGraph);

但是像这样的东西应该写进一个文件。如果您希望将XML存储在内存中,那么可以根据内存流将其写入XMLTextWriter,然后您可以将内容写入字符串变量,或者使用它执行任何需要的操作。

为什么不创建两个类:Graph和Set。图形的属性为
List

然后,您可以在
foreach
中创建实例或图形,并将集合的实例添加到其列表中

完成后,使用XML序列化程序将图形对象序列化为XML。如果您以后需要更改,例如序列化为JSON,那么也可以轻松地输出到另一种格式

编辑以下评论:

从我的头上看可能不是100%正确

var myGraph = BuildMeAGraph();
var serializer = new XmlSerializer(typeof(Graph));
var writer = XmlWriter.Create("myfile.xml");
serializer.Serialize(writer, myGraph);

但是像这样的东西应该写进一个文件。如果您希望将XML存储在内存中,则将其写入基于内存流的XMLTextWriter,然后您可以将内容写入字符串变量或使用它执行任何需要的操作。

我会使用ExpandoObject,但我看不出您这样做的原因。

我会使用ExpandoObject,但是我看不出你这样做的原因。

如果你想从对象树中创建一个XML,那么我认为,你可以尝试以下方法:

XDocument doc = new XDocument
(
   somedatabaseresult.Select
   ( someitem =>
     new XElement("graph", 
                  new XAttribute("Caption", ""),
                  new XAttribute("attribute9", "#something"),
                  someitem.Select
                  (detail =>
                      new XElement("Set", 
                                   new XAttribute("name", "2003"),            
                                   new XAttribute("value", "34784"),
                                   new XAttribute("color", "#003300")
                  )    

   )

);

//save to file as XML
doc.Save("output.xml");

//save to local variable as XML string
string test = doc.ToString();
我为标记编写了保存值,正如您在代码中使用的那样。但是,我想你会喜欢这样:

new XAttribute("name", detail.name),            
new XAttribute("value", detail.value),
new XAttribute("color", detail.color)

或者,如果您想从对象树中创建XML,那么我认为您可以尝试以下方法:

XDocument doc = new XDocument
(
   somedatabaseresult.Select
   ( someitem =>
     new XElement("graph", 
                  new XAttribute("Caption", ""),
                  new XAttribute("attribute9", "#something"),
                  someitem.Select
                  (detail =>
                      new XElement("Set", 
                                   new XAttribute("name", "2003"),            
                                   new XAttribute("value", "34784"),
                                   new XAttribute("color", "#003300")
                  )    

   )

);

//save to file as XML
doc.Save("output.xml");

//save to local variable as XML string
string test = doc.ToString();
我为标记编写了保存值,正如您在代码中使用的那样。但是,我想你会喜欢这样:

new XAttribute("name", detail.name),            
new XAttribute("value", detail.value),
new XAttribute("color", detail.color)

或者,无论您想从对象
细节

中为每个属性赋予什么值,我都喜欢您神秘的
助手
对象。@ChaosPandion,谢谢。不过,这个问题仍然适用;)。我喜欢你神秘的
助手
对象。@ChaosPandion,谢谢。不过,这个问题仍然适用;)@Chaospandio:如果您使用.NET3.5或更高版本,我认为
XDocument
XmlDocument
更优雅。这是创建此类xml的一种方法。我要寻找的重点是使对象几乎不被键入。有第三方工具需要此输出格式。我觉得它很难看,只是连接和字符串化,直到整个字符串“看起来很好”。@Jonas:你说的
几乎没有键入的对象是什么意思?如果您在内存中使用XML字符串,那么您可以这样做:
stringxml=doc.ToString()
@Chaos,我指的是字符串
new-XElement(“Set”)、“…”、new-XAttribute(“name”、“2003”)、
(Set和name)。但我开始发现一个很好的方法来使用它。在每个图形元素内,为每个图形元素添加一个XElement-添加属性。然后添加每个集合元素。@Jonas:您无法准确描述您想要的内容。@chaospandio:如果您使用.Net 3.5或更高版本,我认为
XDocument
XmlDocument
更优雅。这是一种创建此类xml的方法。我要寻找的重点是使对象几乎不被键入。有第三方工具需要此输出格式。我觉得它很难看,只是连接和字符串化,直到整个字符串“看起来很好”。@Jonas:你说的
几乎没有键入的对象是什么意思?如果您在内存中使用XML字符串,那么您可以这样做:
stringxml=doc.ToString()
@Chaos,我指的是字符串
new-XElement(“Set”)、“…”、new-XAttribute(“name”、“2003”)、
(Set和name)。但我开始发现一个很好的方法来使用它。在每个图形元素内,为每个图形元素添加一个XElement-添加属性。然后添加每个集合