Laden...

Typparameter erfüllt nicht die Anforderungen für weiteren Methodenaufruf

Erstellt von abbahex vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.224 Views
Thema geschlossen
A
abbahex Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren
Typparameter erfüllt nicht die Anforderungen für weiteren Methodenaufruf

Hallo zusammen,

ich habe ein kleines Problem bei der Übergabe von Typenparameter. Ich habe mehrere Klassen, welche ich nacheinander einer Methode übergeben möchte z.b. Account und Einstellung.
Durch den Methodenaufruf wird aus einer SQLite Datenbank ein Datensatz ausgelesen. Zur Findung der Tabelle wird eben der Typ angegeben. Nur leider wird "T" bei dem Methodenaufruf in der Load-Methode als fehlerhaft angezeigt. Grundsätzlich weiß ich das ein Konstruktor in dem Typ (Klasse) existieren muss, was auch der Fall bei Account ist.

Wenn ich Load mit <Account> aufrufe hat doch dieser einen Konstruktor, wieso kommt dann die Meldung.

Hoffe das ihr mir helfen könnt. Vielen Dank.

   Account LoadAcc = await PhoneDBConnection.PhoneDBConnection.Load<Account>(TestAccount.AccountID);
  public async static Task<T> Load<T>(Object pID)
       {
           if (Connection != null)
           {
               return await Connection.GetAsync<T>(pID); //T wird als fehlerhaft angezeigt
           }

           return default(T);
       }
 public Task<T> GetAsync<T>(object pk)
            where T : new()
        {
            return Task.Factory.StartNew(() =>
            {
                var conn = GetConnection();
                using (conn.Lock())
                {
                    return conn.Get<T>(pk);
                }
            });
        }

Fehlermeldung> Fehlermeldung:

Fehler 1 "T" muss ein nicht abstrakter Typ mit einem öffentlichen parameterlosen Konstruktor sein, um im generischen Typ oder in der generischen Methode "SQLite.SQLiteAsyncConnection.GetAsync<T>(object)" als Parameter "T" verwendet werden zu können. xxxx\PhoneDBConnection\PhoneDBConnection.cs 133 29 PhoneDBConnection

Ich habe dann noch einwenig gesucht, und den Forumbeitrag Generics: Typparameter zu Laufzeit festlegen gefunden.

Also habe ich mal den zweiten Methodenaufruf so umgebaut. Nur dann bekomme ich eine andere Fehlermeldung. Activator.CreateInstance<T>() könnte object zurückgeben oder?

 public async static Task<T> Load<T>(Object pID)
       {
           if (Connection != null)
           {
               Type varType = Activator.CreateInstance<T>().GetType();
               
              return await typeof(SQLiteAsyncConnection).GetMethod("GetAsync").MakeGenericMethod(varType).Invoke(Activator.CreateInstance<T>(), new object[] {pID}); //wirf Fehlermeldung

               //return await Connection.GetAsync<T>(pID);
           }

           return default(T);
       }

Fehlermeldung:
Fehler 1 Kann 'object' nicht erwarten xxxx\PhoneDBConnection\PhoneDBConnection.cs 135 22 PhoneDBConnection

D
96 Beiträge seit 2012
vor 10 Jahren

Der Typparameter T in der Load<T>-Methode muss auch das new()-Constraint haben, da ansonsten T ein Typ sein kein, der eben keinen parameterlosen Konstruktor hat und somit nicht gültig für den Aufruf von GetAsync<T> ist.

A
abbahex Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren

Das war es (: somit hat die erste Möglichkeit funktioniert.
Vielen Dank

Hinweis von herbivore vor 10 Jahren

Ok, vielleicht ein bisschen tricky, aber im Grunde in der Meldung steht klar, dass der (formale) Typparameter T die Anforderungen nicht erfüllt. Davon, ob der aktuelle Typparameter Account die Anforderungen erfüllt oder nicht erfüllt, ist in der Meldung keine Rede.

Grundsätzlich gilt [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

Thema geschlossen