2013-07-24 16 views
7

C'è un modo con i generici C# per limitare un tipo T a essere calcinabile da un altro tipo?Vincolo generico C# per Tipo da incassare

Esempio:
Diciamo che sto salvare le informazioni nel Registro di sistema come un string, e quando ho ripristinare le informazioni vorrei avere una funzione che sembra qualcosa di simile:

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

non v'è alcuna tali vincoli in .NET –

risposta

4

Non esiste una tipologia di vincoli in .NET. C'è solo sei tipi di vincoli disponibili (vedere Constraints on Type Parameters):

  • where T: struct tipo argomento deve essere un tipo di valore
  • where T: class tipo argomento deve essere un tipo di riferimento
  • where T: new() tipo argomento deve avere un costruttore senza parametri pubblica
  • where T: <base class name> l'argomento di tipo deve essere o derivare dalla classe base specificata
  • where T: <interface name> l'argomento di tipo deve essere o implementare l'interfa specificato ce
  • where T: U tipo di argomento fornito per T deve essere o derivare da l'argomento in dotazione per U

Se vuoi lanciare stringa per il tipo, si può fare la fusione prima di opporsi. Ma non si può mettere vincolo sul parametro type per assicurarsi che questo casting può verificarsi:

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

Un'altra opzione - creare un'interfaccia:

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

E dirla come vincolo:

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

Tipi sono determinati durante la compilazione. Non è possibile modificare i tipi durante il runtime. E 'possibile cast di oggetti alla sua base o un bambino di classe

Ref -

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

+0

mi rendo conto che i tipi sono determinati al momento della compilazione. ma al momento della compilazione è ora possibile anche il riferimento al tipo passato alla funzione. (nello stesso modo in cui. string a = "abc", a [0] funzionerà mentre (a come oggetto) [0] non funzionerà) Quindi non vedo davvero come questo risponda alla domanda ... –

0

I vincoli spiegano come "il tipo di T deve essere di tipo U o di tipo U ereditato", quindi il vincolo che stai cercando non è fattibile.

tutto è "calcinabile" per String in ogni caso, attraverso .ToString() (YMMV)

+0

* * YMMV ha spiegato: ** '.ToString()' è più o meno una funzionalità di debug incorporata. "[Converte un oggetto nella sua rappresentazione di stringa in modo che sia adatto per la visualizzazione.] (Https://msdn.microsoft.com/en-us/library/system.object.tostring.aspX)" - MSDN. Consiglio vivamente contro (ab-) usarlo per il casting. – FooBarTheLittle

Problemi correlati