Laden...

In einer generischen Klasse statische Methode der Basisklasse aufrufen

Erstellt von DeSharper vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.594 Views
D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren
In einer generischen Klasse statische Methode der Basisklasse aufrufen

Hallo,

ich versuche in einer generischen Klasse (TolleGenerischeKlasse<T> where T : Basisklasse) eine statische Methode der Basisklasse aufzurufen. Mein naiver Versuch T.StatischeMethode() hat nicht funktioniert. Mache ich was falsch oder geht das gar nicht? Die Autovervollständigung bietet mir nichtmal new an, nur typeof.

Vereinfachte Codeschnipsel


public class Basisklasse
{
    ...
    
    public static int StatischeMethode(){...}

}

public class TolleGenerischeKlasse<T> where T : Basisklasse
{
    ...

    public TolleGenerischeKlasse (params T[] args)
    {
        T.StatischeMethode(); // geht nicht
        ...
    }
}

16.841 Beiträge seit 2008
vor 7 Jahren

Der Zugriff auf statische Methoden einer generischen Klasse ohne Instanz ist nicht möglich. Sowas nennt sich virtuell statische Methode und das kann die CLR (und eben C#) nicht.
Du brauchst dazu eine Instanz von T.

Statische Methoden sollten aber allgemein vermieden werden; sie sind nicht ordentlich testbar.
Sowas sollte nur verwendet werden, wenn es sinn macht (zB. Extension Methods).

Ich schließe hier also auf einen Designfehler. Vermutlich gibt es eine bessere Lösung.
Wieso brauchst Du hier einen statisch, generischen Klassenzugriff?

Ansonsten eben schmutzig über Reflection
typeof(T).GetMethod("StatischeMethode").Invoke(xyz);

D
985 Beiträge seit 2014
vor 7 Jahren

Da eine statische Methode nicht überschrieben werden kann macht es auch gar keinen Sinn diese statische Methode über die generische Klasse aufzurufen, bzw. was soll denn dabei anderes herauskommen, als wenn ich eben direkt die statische Methode der Basisklasse aufrufe.

Ergo:


ublic class Basisklasse
{
    public static int StatischeMethode(){...}
}

public class TolleGenerischeKlasse<T> where T : Basisklasse
{
    public TolleGenerischeKlasse (params T[] args)
    {
        Basisklasse.StatischeMethode(); // geht jetzt
        ...
    }
}

D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren

Danke für die Antworten, ihr habt natürlich Recht, ich hab mich vollkommen verhaspelt. Jetzt wo ich mir das so anschaue, war das ganz schön blöd. Manchmal ist man so total fixiert darauf, den Nagel mit dem Schraubenzieher in die Wand zu hauen, dass man sich nur ärgert warum der blöde Schraubenzieher nicht richtig funktioniert.