0

内部型を一般的な名前/値ペアのリストに変換する必要があります。これは、新しいフィールドが追加された場合にスキーマの変更などを気にせずに、一般的/標準的な方法で多くの情報を送信できるようにするためです。私の問題は、一般的な構造をどのように設定するかです。

たとえば、フィールドの内部の束:

[Serializable]
public class Location
{
    public string sAddress { get; set; }
    public string sCity { get; set; }
    public int iZipCode { get; set; }
}

次のように変換する必要があります。

<AttributeList>
  <Attribute>
    <Name>sAddress</Name>
    <Value>123 ABC Street</Value>
    <DataType>string</DataType>
  </Attribute>
</AttributeList>

sCityとiZipCodeについて繰り返します。

一部のフィールド(iZipCodeなど)がインスタンス化されない可能性があるため、これを行うための最良の方法がわからないのは私だけです。

私が考えることができる唯一の方法は、内部データ構造内の特定の各フィールドを検索し、それがnullでないことを確認してから、実際の内部フィールド名を含む列挙型オブジェクト(または何か)からAttribute.Nameをマッピングすることです。 (sAddressのように)、次に値、次にタイプを設定します。具体的に探しているフィールドがどのタイプであるかがわかります。

これは、フィールドが3つしかない場合は問題ありませんが、それよりはるかに多くなり、新しいフィールドが追加されたかのように、コードを更新する必要があるかのように、悪いアプローチのように見えます。基本的に同じことをします。

理想的には、場所などの内部構造内のすべてを一般的に循環し、フィールドが存在するかどうかを自動的にチェックし、フィールドごとに特定のコードがなくても、フィールドの名前、値、タイプを取得できるものが必要です。

これが可能かどうかはわかりませんが、アドバイスをいただければ幸いです。

4

2 に答える 2

1

これはリフレクションで行うことができます。次に例を示します。

PropertyInfo[] properties
properties = typeof(Location).GetProperties(BindingFlags.Public);
StringBuilder sb = new StringBuilder()
foreach (PropertyInfo p in properties)
{
    sb.Append(p.Name)
    sb.Append(p.PropertyType)
    sb.Append(p.GetValue(null,null))
}

明らかにフォーマットを変更して、自分に合うようにします。

System.Reflection 名前空間を使用する必要があります。

編集:あなたの編集を見たところ、出力を XML として欲しいとのことでした。XML Serializationも検討する価値があるかもしれません。

于 2013-01-30T16:26:07.350 に答える
1

これにより、例が XML に吐き出されます。インデックス付きプロパティをサポートする場合は、追加の作業を行う必要があります。

Location loc = new Location { sAddress = "123 ABC Street",
                              sCity = "Fake City",
                              iZipCode = 12345 };

XDocument doc = new XDocument();
XElement attrList = new XElement("AttributeList");
doc.Add(attrList);

foreach (PropertyInfo propInfo in loc.GetType().GetProperties())
{
    XElement attrRoot = new XElement("Attribute", new XElement("Name") { Value = propInfo.Name });
    object propValue = propInfo.GetValue(loc, null);
    attrRoot.Add(new XElement("Value") { Value = propValue == null ? "null" : propValue.ToString() });
    attrRoot.Add(new XElement("DataType") { Value = propInfo.PropertyType.ToString() });
    attrList.Add(attrRoot);
}
于 2013-01-30T16:36:35.537 に答える