2009-03-31 5 views
5

Okay, das ist der Fall:Statische Methoden für generische Klassen?

Ich habe eine generische Basisklasse, die ich mit einigen statischen Werten initialisieren muss. Diese Werte haben nichts mit den Typen zu tun, mit denen meine generische Basisklasse geladen ist.

Ich möchte in der Lage sein, so etwas zu tun:

GenericBaseclass.Initialize(AssociatedObject); 

während auch eine Klasse wie dies zu tun mit:

public class DerivedClass : GenericBaseclass<int> 
{ 
    ... 
} 

Gibt es eine Möglichkeit, dies zu erreichen? Ich könnte eine nicht-generische Basisklasse erstellen und die statische Methode dort platzieren, aber ich mag das nicht "hack" :)

+0

Abgesehen von einer nicht-generischen Basisklasse, die die einzige Möglichkeit ist, dies zu tun, wie bereits erwähnt wurde, möchte ich hinzufügen, dass dies kein "Hack" ist, sondern in der Tat der richtige Weg ist. –

Antwort

14

Wenn die Werte nichts mit dem Typ der generischen Basisklasse zu tun haben, dann sollten sie nicht nicht in der generischen Basisklasse sein. Sie sollten sich entweder in einer vollständig separaten Klasse oder in einer nicht-generischen Basisklasse der generischen Klasse befinden.

Beachten Sie, dass für statische Variablen, Sie eine andere statische Variable pro Typ Argument Kombination erhalten:

using System; 

public class GenericType<TFirst, TSecond> 
{ 
    // Never use a public mutable field normally, of course. 
    public static string Foo; 
} 

public class Test 
{  
    static void Main() 
    { 
     // Assign to different combination 
     GenericType<string,int>.Foo = "string,int"; 
     GenericType<int,Guid>.Foo = "int,Guid"; 
     GenericType<int,int>.Foo = "int,int"; 
     GenericType<string,string>.Foo = "string,string"; 


     // Verify that they really are different variables 
     Console.WriteLine(GenericType<string,int>.Foo); 
     Console.WriteLine(GenericType<int,Guid>.Foo); 
     Console.WriteLine(GenericType<int,int>.Foo); 
     Console.WriteLine(GenericType<string,string>.Foo); 

    } 
} 

Es klingt wie Sie nicht tun wirklich pro T Ihrer generic eine andere statische Variable wollen Basisklasse - so können Sie nicht in Ihre generische Basisklasse haben.

+0

"Sollte" wie in "Best Practice" oder "sollte" als in "der einzige Weg, um das gewünschte Verhalten zu erreichen"? :) – cwap

+0

Wenn Sie nur eine statische Variable wollen, obwohl unterschiedliche Argumente angegeben sind, ist dies "die einzige Möglichkeit, das gewünschte Verhalten zu erreichen". –

+0

Danke für die Klärung .. Ich hätte das selbst tun sollen, tut mir leid. Macht aber Sinn :) - Nun, geh ins Bett Mr. Know-It-All: P – cwap

6

Das ist genau das, was Sie tun müssen. Wenn Sie einen Typparameter haben, ist jede unterschiedliche Instanz des Typs ein separater Typ. Dies führt zu separaten statischen Variablen.

Die einzige Problemumgehung besteht darin, eine Basisklasse zu haben, von der die generische Klasse abgeleitet wird.