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
...
}
}
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);
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
...
}
}
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.