2015-07-23 1 views
0

Existe-t-il un moyen de rendre une fonction renvoyer le type d'objet que je passe? Je voudrais appeler la méthode ci-dessous pour retourner le type que je passe. Est-ce possible? Devrais-je même essayer de faire ça? Y at-il un meilleur moyen ... à court d'avoir deux méthodes différentes?Renvoyer l'objet tapé de la méthode

Actuellement, j'ai essayé les deux premiers appels et je récupère (avec le premier appel) ce qui ressemble à un dictionnaire avec un system.object [] dans la partie valeur du dictionnaire. Capture d'écran ci-dessous pourrait le montrer mieux que mon explication. Je demande cela car je pourrais avoir plus de types que j'ai besoin de désérialiser et je ne veux pas avoir une méthode différente pour chacun.

var firstTry = this.Deserialize(path, typeof(ObservableCollection<ListItemPair>(); 

var secondTry = this.Deserialize(path, typeof(ListItemPair)); 

var thirdTry = this.Deserialize(path, typeof(SomeOtherObject)); 

public static object Deserialize(string jsonFile, object type) 
{ 
    var myObject = new object(); 

    try 
    { 
     using (StreamReader r = new StreamReader(jsonFile)) 
     { 
      var serializer = new JavaScriptSerializer(); 

      string json = r.ReadToEnd(); 

      myObject = serializer.Deserialize<object>(json); 
     } 
    } 
    catch (Exception ex) 
    { 
    } 

    return myObject ; 
} 

public class ListItemPair 
{ 
    public string Name 
    { 
     get; 

     set; 
    } 

    public object Value 
    { 
     get; 

     set; 
    } 
} 

objet créé:

enter image description here

+0

vous pouvez appeler .GetType() sur un objet dans .NET si cela suffit – GEEF

+0

, je reviens donc myObject.GetType()? – Wannabe

+0

Eh bien, vous pouvez toujours retourner l'objet désérialisé, mais une fois que vous l'avez récupéré, vous pouvez appeler .GetType() sur l'objet ... Maintenant, si vous voulez connaître le type compiler le temps c'est une histoire différente, mais si vous voulez sortie le type ou quelque chose alors .GetType() devrait fonctionner – GEEF

Répondre

2

Oui, vous pouvez créer une méthode générique. Votre méthode Deserialize() ressemblerait à quelque chose comme ceci:

public static T Deserialize<T>(string jsonFile) 
{ 
    T myObject = default(T); 

    try 
    { 
     using (var r = new StreamReader(jsonFile)) 
     { 
      var serializer = new JavaScriptSerializer(); 
      string json = r.ReadToEnd(); 
      myObject = serializer.Deserialize<T>(json); 
     } 
    } 
    catch (Exception ex) 
    { 
    } 

    return myObject; 
} 

Dans cet exemple T est un paramètre de type. Lors de l'appel de cette méthode, vous pouvez passer le type comme ceci:

var firstTry = Deserialize<ObservableCollection<ListItemPair>>(path); 
var secondTry = Deserialize<ListItemPair>(path); 
var thirdTry = Deserialize<SomeOtherObject>(path); 

Une note de côté: Je ne recommanderais pas avaler en silence une exception. Dans ce cas, on s'attend à ce que la désérialisation puisse échouer. Par conséquent, je changerais à une méthode TryDeserialize():

public static bool TryDeserialize<T>(string jsonFile, out T myObject) 
{ 
    try 
    { 
     using (var r = new StreamReader(jsonFile)) 
     { 
      var serializer = new JavaScriptSerializer(); 
      string json = r.ReadToEnd(); 
      myObject = serializer.Deserialize<T>(json); 
     } 
    } 
    catch (Exception ex) 
    { 
     myObject = default(T); 
     return false; 
    } 

    return true; 
} 
+0

Excellent! C'est ce dont j'avais besoin. Je n'ai juste pas compris comment le construire. Je vous remercie. – Wannabe

+0

Droite. Je n'ai pas encore rempli les captures. J'aime bien comment vous avez restructuré la méthode et changerai la mienne en conséquence. – Wannabe