Laden...

[gelöst] generischer Methoden-Rückgabewert <TModel>

Erstellt von DuRom vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.524 Views
D
DuRom Themenstarter:in
4 Beiträge seit 2010
vor 10 Jahren
[gelöst] generischer Methoden-Rückgabewert <TModel>

Hallo zusammen,
ich versuche seit einigen Tagen ein altes stück Software in eine WPF-MVVM Applikation einfliesen zu lassen. Um die ganzen Views zu füttern benötige ich einige Models die ihre Daten aus einer Datenbank beziehen.
Ich möchte nun vermeiden für jedes Model eine eigene Abfrage zu generieren aber auch mir große Mengen an Daten aus der Datenbank zu ziehen und diese in das benötigte Format zu überführen.
Ich dachte da an generische Methoden bin aber in dem Thema nicht so bewandert, meine aktuelle Bemühung sieht so aus:


public static List<TModel> GetValuesByColumn<TModel>(string TabellenName, string SpaltenName, int ID) where TModel : class
        {
            SqlCeConnection conn = null;
            var liste = new List<TModel>();

            try
            {
                conn = new SqlCeConnection("Data Source = " + Properties.Settings.Default.DatenbankPfad);
                conn.Open();

                SqlCeCommand cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT * FROM " + TabellenName + " WHERE " + SpaltenName + "=" + ID;
                SqlCeDataReader reader = cmd.ExecuteReader(CommandBehavior.Default);

                if(typeof(TModel) == typeof(Model.Project))
                {
                    while(reader.Read())
                    {
                        var data = new Model.Project();
                        data.ID = int.Parse(reader["id"].ToString());
                        data.Pfad = (string)reader["pfad"];
                        data.Name = (string)reader["name"];
                        liste.Add(data);
                    }
                    return liste;
                }
            }
            catch
            { }
            finally
            {
                conn.Close();
            }
        }

Leider meckert der Compiler immer am Rückgabe Datentyp rum, "liste.add(data)" bringt als Fehlermeldung > Fehlermeldung:

Die beste Übereinstimmung für die überladene System.Collections.Generic.List<TModel>.Add(TModel)-Methode hat einige ungültige Argumente.

Ich bin hier mit meinem latein am ende. Kann mir jemand ein Tip geben oder zumindest ein paar Denkanstöße in die richtige Richtung?

S
248 Beiträge seit 2008
vor 10 Jahren

Hallo DuRom,

Model.Project muss TModel implementieren.

Grüße
spooky

D
DuRom Themenstarter:in
4 Beiträge seit 2010
vor 10 Jahren

Hi Spooky,
sorry das meine Antwort so lange dauert. Bin nicht dazu gekommen weiter zu machen.


public class Project
{
    //...
}

public class Project<TModel> where TModel : class
{
    //...
}

Hast du das gemeint Spook?

ich hab das ganze nun so gelöst:


public static List<TModel> GetValuesByColumn<TModel>(string TabellenName, string SpaltenName, int ID) where TModel : Model.Project
{
    .                       
    . 
     liste.Add((TModel)data);
    .
}

Also die Hauptänderung besteht darin das ich nun "conrete typ" bei der Methode angebe und so den Rückgabetyp definieren kann.

F
10.010 Beiträge seit 2004
vor 10 Jahren

Nur so als frage, du weist schon das es ORMapper gibt, die dir das alles schon abnehmen?