0

これは奇妙に思えます (明らかな何かが欠けていない限り)。この文字列を保存する必要があります:

{TestField1:=TestAltField1}{TestField2:=TestAltField2}

XML 値フィールドで、次のようになります。

<ResultFieldAlias>{TestField1:=TestAltField1}{TestField2:=TestAltField2}</ResultFieldAlias>

値は文字列、文字列ディクショナリに格納されます。しかし、foreach ループとリフレクションで XElement "XML" の XElements から引き出そうとすると、ブラケットが変更され、コロンが削除されて、次のようになります。

[TestField1, TestAltField1][TestField2, TestAltField2]

リフレクションを介してプロパティを取得するために使用しているコードは次のとおりです。

PropertyInfo[] properties = GetPublicProperties();

//loop through each entry in the dictionary and try to find its matching property
foreach (XE xe in XML.Elements())
{
    //Try to find a matching prop to this key
    PropertyInfo prop = properties.FirstOrDefault(p => p.Name.ToLower() == xe.Name.ToString().ToLower());

    if (prop != null)
        if (prop.PropertyType == typeof(bool))
            prop.SetValue(this, bool.Parse(xe.Value), null);
        else if (prop.PropertyType == typeof(FontSettings))
            prop.SetValue(this, new FontSettings(xe), null);
        else if (prop.PropertyType == typeof(Dictionary<string, string>))
            prop.SetValue(this, MyExtension.Deserialize(xe.Value), null);
        else
            prop.SetValue(this, xe.Value, null);
}

カーリーと := を含むフォーマットを想定している Deserialize 関数に注意してください。デバッグするとき、ループ内の xe オブジェクトを見ると、即時ウィンドウからこれを取得します。

? xe
<ResultFieldAlias>[TestField1, TestAltField1][TestField2, TestAltField2]</ResultFieldAlias>
    base {System.Xml.Linq.XContainer}: <ResultFieldAlias>[TestField1, TestAltField1][TestField2, TestAltField2]</ResultFieldAlias>
    FirstAttribute: null
    HasAttributes: false
    HasElements: false
    IsEmpty: false
    lastAttr: null
    LastAttribute: null
    Name: {ResultFieldAlias}
    name: {ResultFieldAlias}
    NodeType: Element
    Value: "[TestField1, TestAltField1][TestField2, TestAltField2]"

しかし、XML の最後の要素に基づいてまったく新しい XElement を作成すると (たまたま着地した場所には、その前にたくさんあります)、適切な書式設定が得られます。

? XElement xe1 =  XML.Elements().Last();
<ResultFieldAlias>{TestField1:=TestAltField1}{TestField2:=TestAltField2}</ResultFieldAlias>
    base {System.Xml.Linq.XContainer}: <ResultFieldAlias>{TestField1:=TestAltField1}{TestField2:=TestAltField2}</ResultFieldAlias>
    FirstAttribute: null
    HasAttributes: false
    HasElements: false
    IsEmpty: false
    lastAttr: null
    LastAttribute: null
    Name: {ResultFieldAlias}
    name: {ResultFieldAlias}
    NodeType: Element
    Value: "{TestField1:=TestAltField1}{TestField2:=TestAltField2}"

何を与える?ありがとう。

アップデート:

Jeff のコメントに回答して情報を追加するために、XML オブジェクト (XElement) がこの関数に渡されます。TestField は、"ResultFieldAlias" と呼ばれる文字列、文字列辞書の Add メソッドを使用して追加され、XML タグ "ResultFieldAlias" でラップされる前に、この関数を使用して文字列に変換されます。

public static string Serialize(Dictionary<string, string> data)
{
    if (data == null) 
        return null;

    return "{" + String.Join("}{", data.Select(c => c.Key + ":=" + c.Value).ToArray()) + "}";
}

結果は次のとおりです (末尾のみ - 投稿するには膨大な量になります)。

<Callouts>
    .....
    .....   
  <ResultExceedFont>
    <FontSettings>
      <FontName>Curlz MT</FontName>
      <FontColor>#FF6B8E23</FontColor>
      <FontSize>15</FontSize>
      <FontUnderline>false</FontUnderline>
      <FontBold>false</FontBold>
      <FontItalic>true</FontItalic>
    </FontSettings>
  </ResultExceedFont>
  <ResultFieldAlias>{TestField1:=TestAltField1}{TestField2:=TestAltField2}</ResultFieldAlias>
</Callouts>

VS のイミディエイト ウィンドウから取得した前の 2 つのコード ペースト (先頭の ? を使用) は、行 "prop.SetValue(this, MyExtension.Deserialize(xe.Value), null); の Break で取得されます。 " そのため、同じ XML オブジェクトを同時にヒットしています。正確なカット アンド ペーストを次に示します (ここでも、XML ダンプを省略しています)。

? XML
....
  <ResultExceedFont>
    <FontSettings>
      <FontName>Curlz MT</FontName>
      <FontColor>#FF6B8E23</FontColor>
      <FontSize>15</FontSize>
      <FontUnderline>false</FontUnderline>
      <FontBold>false</FontBold>
      <FontItalic>true</FontItalic>
    </FontSettings>
  </ResultExceedFont>
  <ResultFieldAlias>{TestField1:=TestAltField1}{TestField2:=TestAltField2}</ResultFieldAlias>
</Callouts>
    FirstAttribute: null
    HasAttributes: false
    HasElements: true
    IsEmpty: false
    lastAttr: null
    LastAttribute: null
    Name: {Callouts}
    name: {Callouts}
    NodeType: Element
    Value: "falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse[TestField1, TestAltField1][TestField2, TestAltField2]falsefalseBalloonfalse#FFFFFF00Adobe Song Std#FF228B2210truetruetrueAdobe Ming Std#FFF0808010truetruetrueAdobe Kaiti Std#FFDC143C20truefalsetrueCurlz MT#FF6B8E2315falsefalsetrue{TestField1:=TestAltField1}{TestField2:=TestAltField2}"
?xe
<ResultFieldAlias>[TestField1, TestAltField1][TestField2, TestAltField2]</ResultFieldAlias>
    base {System.Xml.Linq.XContainer}: <ResultFieldAlias>[TestField1, TestAltField1][TestField2, TestAltField2]</ResultFieldAlias>
    FirstAttribute: null
    HasAttributes: false
    HasElements: false
    IsEmpty: false
    lastAttr: null
    LastAttribute: null
    Name: {ResultFieldAlias}
    name: {ResultFieldAlias}
    NodeType: Element
    Value: "[TestField1, TestAltField1][TestField2, TestAltField2]"
?XML.Elements().Last()
<ResultFieldAlias>{TestField1:=TestAltField1}{TestField2:=TestAltField2}</ResultFieldAlias>
    base {System.Xml.Linq.XContainer}: <ResultFieldAlias>{TestField1:=TestAltField1}{TestField2:=TestAltField2}</ResultFieldAlias>
    FirstAttribute: null
    HasAttributes: false
    HasElements: false
    IsEmpty: false
    lastAttr: null
    LastAttribute: null
    Name: {ResultFieldAlias}
    name: {ResultFieldAlias}
    NodeType: Element
    Value: "{TestField1:=TestAltField1}{TestField2:=TestAltField2}"
4

1 に答える 1