2014-07-21 4 views
0

J'ai quelques classes:Parsing une classe pour fonctionner comme un argument

public class clsAnimal 
     { 
      public int ID { get; set; } 
      public string Strain { get; set; } 
     } 

    public class clsHybridom 
     { 
      public int ID { get; set; } 
      public string Haplo { get; set; } 
     } 

Ces cours sont instanciés en session:

Session["clsAnimal"] = new clsAnimal(); 

et accédés comme (si elles existent meilleure méthode, s'il vous plaît laissez-moi savoir):

((clsAnimal)Session["clsAnimal"]) 

Il y a beaucoup de classes comme ces deux, j'ai un commutateur et demande classe instanciation requise . La classe Instanced doit être analysée en MyFunction.

Il est public static class avec des fonctions utilisées dans le projet entier et dans cette classe devrait être ma fonction MyFunction

Mais hélas! Je ne sais pas comment analyser ces classes en fonction MyFunction

Mon essai était quelque chose comme:

ASMX:

object ReturnObject; 
Session["clsAnimal"] = new clsAnimal(); 
ReturnObject = Activator.CreateInstance(((clsAnimal)Session["clsAnimal"])); 

return clsDataProc.MyFunction(ReturnObject); 

public static class:

public static string MyFunction(object o) 
    { 
     return Do_Some_Evil_Things_With_Parsed_Class(); 
    } 

Il est évident que cela ne va pas se produire parce que:

  • ne peut pas convertir 'clsAnimal' à 'System.Type'
  • Le match de la meilleure méthode surchargée pour 'System.Activator.CreateInstance (System.Type, params objet [])' a quelques arguments invalides

Longue histoire courte: comment analyser classe instanciée en chaîne statique publique MyFunction?

+0

Pourquoi passer ne vous pas le typeof (clsAnimal) en tant que second paramètre de votre xmlserializer? –

+1

Et pourquoi ne pas arrêter de préfixer toutes les classes avec 'cls'? Être une classe n'est pas une chose si spéciale que vous devez préfixer toutes les classes, juste pour vous rappeler qu'elles sont des classes. –

+1

D'accord avec JohnSaunders, avec des IDE modernes dans les langages de programmation sécurisés. Notation hongroise est ridicule, encore plus sur ** types ** ... – Bas

Répondre

1

Il semble que vous essayez de sérialiser Xml un objet en une chaîne. Alors vous essayez de construire un System.Xml.Serialization.XmlSerializer. Il veut connaître le type de l'objet à sérialiser. Si vous connaissez le type d'objet au moment de la compilation, qu'il semble que vous pouvez faire, vous faites ceci:

clsAnimal a = ((clsAnimal)Session["clsAnimal"]); 
var serializer = new XmlSerializer(typeof(clsAnimal)); 
serializer.Serialize(..., a); 

où ... est votre stringstream ou autre chose. Je suppose que vous avez cette partie vers le bas. Si vous ne connaissez pas le type à la compilation, vous utilisez GetType()

object o = Session["clsAnimal"]; // No idea what this type is! 
var serializer = new XmlSerializer(o.GetType()); // That's okay, just get the type at runtime 
serializer.Serialize(..., o); 

Si vous voulez conclure que dans une fonction, il y a deux façons d'obtenir le type:

1) Utilisez un générique.Ensuite, vous pouvez obtenir le type de typeof (T):

public static string XMLSerialize<T>(T objectToSerialize) 

2) Utilisez objet, puis GetType()

public static string XMLSerialize(object objectToSerialize) 

J'espère avoir compris la question assez bien pour aider.

+0

Évidemment, j'ai fait une erreur en mettant des informations sur mon intention avec ces classes dans ma question. S'il vous plaît ignorer le sérialiseur. La question est: "Comment analyser une classe en fonction comme argument?" – dllhell

+0

vous pouvez passer "une instance d'une classe" dans une fonction, ou vous pouvez passer le "type" de la classe dans une fonction. GetType() fait cela. –

0

Peut-être une autre solution ici serait d'utiliser une interface dont toutes vos classes héritent.

Public interface IMyfunctionInterface 
{ 
    public MyFunction(); 
} 

Et vous pourriez faire quelque chose comme ça avec toutes vos classes qui héritent de cette interface:

Session["clsAnimal"] = new clsAnimal(); 
((IMyfunctionInterface)Session["clsAnimal"]).MyFunction(); 

Juste une pensée ...

Questions connexes