webForumDet fria alternativet

XLinq med Reflection och generics

.NET

4 svar · 449 visningar · startad av cok

Medlem sedan dec. 2005664 inlägg
Frågan#1

Hallå,

Jag försöker göra en hyfas generell metod för att hämta tillbaka object från xml med QLinq (mest för att förstå hur det fungerar).

Följande kod hämtar objekt

var result = from e in XElement.Load(path).Elements(t.GetType().Name)
    select new T()
    {
    };

Problemet är att jag får tillbaka X antal object som jag vill men de är tomma. Detta är ju inte så konstigt när jag inte fyller objectet efter new T().

Men jag vet itne hur jag ska lyckas fylla det, det verkar som man inte kan iterera i själva new T(). Antagligen är jag på helt fel spår, så någon får gärna komma med förslag på denna lösning eller hur man annars skulle kunna göra.

Medlem sedan dec. 2005664 inlägg
#2

Har tills vidare löst det som nedan (känns ok men ovan försök känns som det vore bättre att gör men vet ej om det går öht:

public List<T> LoadFromXml(string path)
{
    FileInfo fileInfo = new FileInfo(path);
    if (!fileInfo.Exists)
        return new List<T>();

    XElement results = XElement.Load(path); ;

    List<T> tList = new List<T>();

    foreach (XElement elements in results.Elements((typeof(T)).Name))
    {
        T newT = new T();
        PropertyInfo[] props = newT.GetType().GetProperties();
        foreach (PropertyInfo prop in props)
        {
            if (prop.PropertyType == typeof(string))
                prop.SetValue(newT, (string)elements.Element(prop.Name), null);
            else if (prop.PropertyType == typeof(DateTime))
                prop.SetValue(newT, (DateTime)elements.Element(prop.Name), null);
            else if (prop.PropertyType == typeof(int))
                prop.SetValue(newT, (int)elements.Element(prop.Name), null);
        }
        tList.Add(newT);
    }

    return tList;

}
Medlem sedan dec. 19996 721 inlägg
#3

Du måste använda reflection, så du är helt rätt ute. Möjligen kan det vara en idé att markera de properties som ska sättas (med ett attribut) eller skapa en Fill(XElement element)-metod på klassen som skapas.

Medlem sedan dec. 2005664 inlägg
#4

emission skrev:

Du måste använda reflection, så du är helt rätt ute. Möjligen kan det vara en idé att markera de properties som ska sättas (med ett attribut) eller skapa en Fill(XElement element)-metod på klassen som skapas.

Japp, det kan man ju göra (y)
Frågan var hur jag kunde lösa att få ut objekten i XLinx i selecten eller itterationen. Tack för påpekandet! :)

Medlem sedan dec. 19996 721 inlägg
#5

Det snyggaste sättet att få ut objekten är ungefär så här:

public IEnumerable<T> LoadFromXml(string path)
{
    //blabla

    foreach (XElement elements in results.Elements((typeof(T)).Name))
    {
        T newT = new T();
        //blabla
        yield return newT;
    }
}
263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)