2010-12-13 3 views
1
public static T Get<T>() where T : class 
{ 
    string implName = Program.Settings[typeof(T).Name].ToString(); 
    object concrete = Activator.CreateInstance(Type.GetType(implName)); 

    return (T)concrete; 
} 

S'il vous plaît expliquer ce ne soit() où T signifie?C# syntaxe aide -> Qu'est-ce que ca ne <T>() où T signifie

Bienvenue pour mettre quelques URL de lecture.

+2

Juste une note que ce code me semble très fragile. Si vous l'appelez avec un type qui n'a pas de clé dans les paramètres, il lèvera une exception. –

Répondre

2

Ceci est un exemple de générique. 'T' représente un type.

Par exemple:

string result = Get<string>(); 

Faites une recherche Google sur Generics. Cela vous aidera à démarrer: http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx

+1

Aw, enregistrer un codeur a ctrl + c/v. Faites-en un lien direct. ;-) –

+2

le premier exemple lancera une erreur de compilation car 'int' n'est pas un type de référence. Vous devez mentionner ici l'importance de la contrainte 'where' (ou supprimer le premier exemple) – RPM1984

+0

@brad http://goo.gl/nLUyy :) –

2

Le where T : class met une contrainte sur quels types sont autorisés pour T. Cela

  1. Donnez-vous une erreur du compilateur si vous mettez dans un mauvais type
  2. Vous donne accès à des méthodes d'accès/propriétés ou instances instancier de T en fonction de la contrainte

donc pour la méthode cela produira une erreur si vous l'appelez comme ceci Get<int>() puisque int n'est pas une classe.

public static T Get<T>() where T : class 
{ 
    string implName = Program.Settings[typeof(T).Name].ToString(); 
    var implType = Type.GetType(implName); 

    return (T)Activator.CreateInstance(implType); 
} 
+0

Cela ne sera pas compilé. Aucune surcharge de ce type n'existe. – SLaks

+0

ah oui ... mon mauvais, l'argument T et le type est ambigu. –

1

Ceci contraindra T à être un type de référence dans ce cas particulier.