2009-12-04 2 views
14

J'écris une méthode d'extension pour analyser la chaîne JSON pour un type donné. Je voulais utiliser la méthode sur les types au lieu des instances comme de nombreux exemples que nous connaissons déjà, mais je pense que ce n'est pas supporté par Visual Studio. Quelqu'un peut-il m'éclairer ici? Ce qui suit est la méthode:Comment créer des méthodes d'extension pour les types

public static T ParseJson<T>(this T t, string str) where T: Type 
{ 
    if (string.IsNullOrEmpty(str)) return null; 
    var serializer = new JavaScriptSerializer(); 
    var obj = serializer.Deserialize<T>(str); 
    return obj; 
} 

Je veux appeler la méthode de cette façon:

var instance = MyClass.ParseJson(text); 

Merci

+0

Notez que 'ParseJson' renvoie un' Type' et non un 'MyClass' avec cette définition. – dtb

+0

Merci pour la capture. J'ai effectivement essayé var instance = typeof (MyClass) .ParseJson (texte); ne fonctionne pas – Codism

Répondre

18

La réponse courte est il ne peut pas être fait; Les méthodes d'extension doivent fonctionner sur une instance de quelque chose.

2

Vous ne pouvez pas créer de méthodes d'extension qui s'appliquent au type lui-même. Ils ne peuvent être appelés que sur les instances d'un type.

+1

et null instances de ce type qui est l'une des valeurs de rachat de ext. méthodes :) chaîne val = null; val.IsNullOrEmpty() Sweet ... –

+0

semble comme un hack propre! – Codism

3

Pour utiliser la méthode d'extension, vous devez faire:

var instance = typeof(MyClass).ParseJson(text); 

Le jeton « MyClass » est pas un type instamce intself, mais en utilisant typeof vous obtiendrez un type d'opérer. Mais comment est-ce mieux que:

var instance = JsonUtility.ParseJson<MyClass>(text); 

Edit: En fait, le code de la méthode d'extension ne serait pas encore faire ce que vous vouliez. Il retournera toujours un objet "Type", pas une instance de ce type.

+0

Votre modification est correcte Chris. Cela n'a pas fonctionné pour moi. –

Questions connexes