1

車のリスト(IEnumerable)を返すメソッドがあります..

(ReturntypesIEnumerable<Car>とで正常に動作しますList<Car>):

public IEnumerable<Car> GetCars(string xml)
{
    var myResultList;

     XElement doc = XElement.Parse(xml);
     myResultList = doc.Descendants().Descendants("dict").Select(
     x => new Employee
     {
         Id = x.Elements("string").ElementAt(0).Value,
         Prename = x.Elements("string").ElementAt(1).Value,
         Name = x.Elements("string").ElementAt(2).Value,
         Initials = x.Elements("string").ElementAt(3).Value
    }
    );

    IEnumerable<Car> enumerable = myResultList;
    return enumerable;

    //---

    //or as a List if it's better?
    List<Car> asList = enumerable.ToList();
    //then: return asList
}

ここで、このメソッドをジェネリックにしたいと思います。すべての IEnumerable Type / Or List Type が可能である必要があります。

このようなもの - それがどのように機能するかわからないので、それは単なる疑似コードです。

public IEnumerable<T> GetData(string xml)
{
    var myResultList;

    //...myResultList.. will be filled here (unnecessary) 

    IEnumerable<T> enumerable = myResultList;
    return enumerable;

    //---

    //or as a List if it's better?
    List<T> asList = enumerable.ToList();
    //then: return asList
}

私の質問が十分に明確であることを願っています..の代わりにのような他のタイプがあると想像してみてください。ただし、すべてのタイプに同じ方法を使用したかったのです。

どうすればそれを達成できますか?助けていただければ幸いです。

編集:

「myResultsList」を埋めるコードを追加しました

編集2:同じメソッドで動作する2つのXML:

 <plist version="1.0">
  <dict>
    <key>DataType</key>
    <string>Employee</string>
    <key>8000</key>
    <dict>
      <key>MitarbeiterNo</key>
      <string>8000</string>
      <key>Vorname</key>
      <string>Walter</string>
      <key>Name</key>
      <string>Walter Lohner Stans</string>
      <key>Initialien</key>
      <string>MAL</string>
    </dict>
    <key>8001</key>
    <dict>
      <key>MitarbeiterNo</key>
      <string>8001</string>
      <key>Vorname</key>
      <string>Motorrad</string>
      <key>Name</key>
      <string> Meierskappel</string>
      <key>Initialien</key>
      <string>MAM</string>
    </dict>
    <key>8004</key>
    <dict>
      <key>MitarbeiterNo</key>
      <string>8004</string>
      <key>Vorname</key>
      <string>Hanspeter</string>
      <key>Name</key>
      <string>Altenbürger AG  Horgen</string>
      <key>Initialien</key>
      <string>FH</string>
    </dict>
  </dict>
</plist>

 <plist version="1.0">
  <dict>
    <key>DataType</key>
    <string>Agent</string>
    <key>7000</key>
    <dict>
      <key>AgentNo</key>
      <string>7000</string>
      <key>Initialien</key>
      <string>VW</string>
      <key>Namen</key>
      <string>Walter Gnos Vertretungen  Vevey</string>
    </dict>
    <key>7001</key>
    <dict>
      <key>AgentNo</key>
      <string>7001</string>
      <key>Namen</key>
      <string>Miller GmbH Bern</string>
    </dict>
    <key>7002</key>
    <dict>
      <key>AgentNo</key>
      <string>7002</string>
      <key>Initialien</key>
      <string>MAL</string>
      <key>Namen</key>
      <string>Walter Lohner Stans</string>
    </dict>
  </dict>
</plist>
4

2 に答える 2

0

これがあなたがやろうとしていることの例です。このコードをコンソールアプリケーションに貼り付けることができます。

using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace Stackoverflow
{
    public class Foo
    {
        public int Id { get; set; }
        public Bar Bar { get; set; }
    }

    public class Bar { }

    class Program
    {
        private static void Main()
        {
            var foos = new List<Foo>
                           {
                               new Foo { Id =1, Bar = new Bar()},
                               new Foo { Id =2, Bar = null},
                               new Foo { Id =3, Bar = new Bar()},
                               new Foo { Id =4, Bar = null},
                           };

            var xml = ToXml(foos);

            var result = GetData<List<Foo>>(xml);
        }

        private static string ToXml(List<Foo> foos)
        {
            XmlSerializer ser = new XmlSerializer(foos.GetType());
            StringBuilder sb = new StringBuilder();
            StringWriter writer = new StringWriter(sb);
            ser.Serialize(writer, foos);

            string xml = sb.ToString();
            return xml;
        }

        public static T GetData<T>(string xml)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement);
            XmlSerializer ser = new XmlSerializer(typeof(T));
            object obj = ser.Deserialize(reader);

            T result = (T)obj;

            return result;
        }
    }
}
于 2012-10-02T10:55:03.310 に答える