2013-07-24 16 views
7

Gibt es eine Möglichkeit mit C# -Generika, einen Typ T von einem anderen Typ zu casten?C# generische Einschränkung für Typ, der gießbar ist

Beispiel:
Lets sagen, dass ich Informationen als string in der Registrierung speichere, und wenn ich die Informationen wiederherstellen würde Ich mag eine Funktion haben, die so ähnlich aussieht:

static T GetObjectFromRegistry<T>(string regPath) where T castable from string 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = (T)regValue; 
    return objectValue ; 
} 
+1

Es gibt keine solche Einschränkungen in .NET –

Antwort

4

Es gibt keine solche Art von Einschränkungen in .NET. Es gibt nur sechs Arten von Einschränkungen zur Verfügung (siehe Constraints on Type Parameters):

  • where T: struct Typargument ein Werttyp
  • where T: class Typargument ein Referenztyp
  • where T: new() Argument Typ sein muss, einen öffentlichen parameterlosen Konstruktor muss sein müssen
  • where T: <base class name> Typ Argument muss von der angegebenen Basisklasse sein oder ableiten
  • where T: <interface name> Typargument muss die angegebene interfa sein oder implementieren ce
  • where T: U Typargument für T geliefert müssen oder vom Argument für U geliefert abzuleiten sein

Wenn Sie Zeichenfolge auf Ihre Art werfen möchten, können Sie zunächst nichts dagegen haben Gießen. Aber man kann nicht Einschränkung für Typ-Parameter setzen, um dieses Casting stellen Sie sicher auftreten:

static T GetObjectFromRegistry<T>(string regPath) 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = (T)(object)regValue; 
    return objectValue ; 
} 

Eine weitere Option - erstellen Schnittstelle:

public interface IInitializable 
{ 
    void InitFrom(string s); 
} 

und legte es als Einschränkung:

static T GetObjectFromRegistry<T>(string regPath) 
    where T: IInitializable, new() 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = new T(); 
    objectValue.InitFrom(regValue); 
    return objectValue ; 
} 
0

Typen werden beim Kompilieren ermittelt. Sie können die Typen zur Laufzeit nicht ändern. Es ist möglich, Objekt zu seiner Basis oder Kind Klasse

Ref zu werfen -

Difference between object a = new Dog() vs Dog a = new Dog()

+0

Ich weiß, dass Typen bei der Kompilierung festgelegt werden. aber zur Kompilierzeit kann man nun auch die Typreferenz an die Funktion übergeben. (in der gleichen Weise, dass. string a = "abc", ein [0] wird funktionieren, während (ein als Objekt) [0] wird nicht) Also ich sehe nicht wirklich, wie dies die Frage beantwortet ... –

0

Constraints formulieren wie "der Typ von T muss entweder vom Typ U sein oder den Typ U erben", so dass die Einschränkung, nach der Sie suchen, nicht machbar ist.

alles ist „gießbaren“ zu String ohnehin durch .ToString() (YMMV)

+0

* * YMMV erklärt: ** '.ToString()' ist mehr oder weniger ein eingebautes Debugging-Feature. "[Es konvertiert ein Objekt in seine Zeichenfolgendarstellung, so dass es für die Anzeige geeignet ist.] (Https://msdn.microsoft.com/en-us/library/system.object.tostring.aspX)" - MSDN. Ich rate dringend davon ab, es zum Gießen zu benutzen. – FooBarTheLittle

Verwandte Themen