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
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.
Das war es (: somit hat die erste Möglichkeit funktioniert.
Vielen Dank
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).