Laden...

Nach Instanzierung eines generisches Typs mit Activator.CreateInstance: Methodenzugriff

Erstellt von msycho vor 15 Jahren Letzter Beitrag vor 15 Jahren 916 Views
M
msycho Themenstarter:in
234 Beiträge seit 2007
vor 15 Jahren
Nach Instanzierung eines generisches Typs mit Activator.CreateInstance: Methodenzugriff

Hallo!

Ich habe eine generische Methode mit zwei Generikas.
Ich möchte beide instanzieren und auf die Methoden des eigentlichen Typs zugreifen.
Die Instanz habe ich erstellt, doch wie komme ich auf die Methoden?

public bool Selection<T, U>(out Fehler fehler)
        {
            fehler = new Fehler();

            try
            {
                T sqlConnection = default(T);
                U sqlCommand = default(U);

                Type typConnection = typeof(T);
                Type typCommand = typeof(U);
                
                StringBuilder sb = new StringBuilder();
                sb.Append("SELECT * FROM ");
                sb.AppendLine(dbTable);

                object oConnection = Activator.CreateInstance(typConnection, new object[] { GetConnectionString(dbUser, dbPassword, dbServer, dbDatabase) });
                object oCommand = Activator.CreateInstance(typCommand, new object[] { sb.ToString(), oConnection });

                sqlConnection = (T)oConnection;
                sqlCommand = (U)oCommand;                

                return true;
            }
            catch(Exception ex)
            {
                fehler.Message = ex.Message;
                return false;
            }
        }
Gelöschter Account
vor 15 Jahren

a: du zwingst mit einem constraint den generischen typ ein interface zu implementieren.
b: du zwingst den generischen typ über ein contraint einen bestimmten basistyp zu implementieren
c: reflection

edit: in deinem fall ist "b" vorzuziehen.

M
msycho Themenstarter:in
234 Beiträge seit 2007
vor 15 Jahren

Folgende Typen können angenommen werden:

  • SqlConnection oder OleDbConnection bzw.
  • SqlCommand oder OleDbCommand
Gelöschter Account
vor 15 Jahren

nimm lieber DbConnection und DbCommand

R
234 Beiträge seit 2007
vor 15 Jahren

Ich verstehe nicht wieso du in diesem Fall Generika verwendest? Kannst du als Parameter nicht einfach DbConnection und DbCommand verwenden? Sollte doch dank Polymorphie funktionieren.

/Edit: Die Constraints, von denen Jack30Lena (der mal wieder schnell war) spricht, könnten übrigens so aussehen:


public bool Selection<T, U>(out Fehler fehler) where T : DbConnection where U: DbCommand {
    // ...
}

/Edit2: Aber wie gesagt, machs lieber nicht mit Generikas. 😉

Gelöschter Account
vor 15 Jahren

gutes argument. hier sind generics wirklich fehl am platz.

O
778 Beiträge seit 2007
vor 15 Jahren

nimm noch lieber IDbConnection und IDbCommand (das wäre dann allerdings die Variante a). Es sei denn du brauchst an einer Stelle wirklich die Methoden von DbConnection bzw. DbCommand.

Wenn du die Klassen auch instanziieren willst, dann empfiehlt es sich außerdem per TypeConstraint einen parameterlosen Konstruktor vorzuschreiben, dann kannst du den auch benutzen.

//edit: Beim Beispielcode sind die Generika wirklich überflüssig, ja

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo onlinegurke

nimm noch lieber IDbConnection und IDbCommand (das wäre dann allerdings die Variante a). Es sei denn du brauchst an einer Stelle wirklich die Methoden von DbConnection bzw. DbCommand.

DbXYZ sind neuer als die Interfaces und von Microsoft empfohlen, über den Interfaces.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011