2014-07-21 175 views
0

我有一些类:解析类函数作为参数

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; } 
     } 

这些类实例化到会话:

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

,并像访问(如果存在更好的方法,请让我知道):

((clsAnimal)Session["clsAnimal"]) 

有很多这样的类,我有一个开关,并通过请求实例所需的类。实例类应该被解析为MyFunction

有一个在整个项目和使用的这个类应该是我的功能MyFunction的

但可惜功能的公共静态类!我不知道如何将这些类解析成函数MyFunction的

我的尝试是这样的:

ASMX:

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

return clsDataProc.MyFunction(ReturnObject); 

公共静态类:

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

显然这不会发生,因为:

  • 无法从 'clsAnimal' 转换为 '的System.Type'
  • 为 'System.Activator.CreateInstance(System.Type的,params对象[])' 最好的重载的方法匹配具有 一些无效参数

长话短说:如何解析实例类到公共静态字符串MyFunction

+0

你为什么不通过将typeof( clsAnimal)作为你的xmlserializer的第二个参数? –

+1

为什么不停止用'cls'前缀所有类?成为班级并不是一件特殊的事情,你需要为所有班级加上前缀,只是为了提醒你他们是班级。 –

+1

同意JohnSaunders与现代IDE的类型安全编程语言匈牙利符号是荒谬的,甚至更多的**类型** ... – Bas

回答

1

这听起来像你正在尝试Xml序列化一个对象到一个字符串。所以你试图构造一个System.Xml.Serialization.XmlSerializer。它想知道要序列化的对象的类型。如果您知道编译时的对象类型,您可以这样做:

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

其中......是您的StringStream或其他。我想你有这个部分。如果你不知道在编译时的类型,你用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); 

如果你想换行,在一个功能,有两种方式来获取类型:

1)使用通用的。然后你就可以拿到类型的typeof(T):()

public static string XMLSerialize(object objectToSerialize) 

public static string XMLSerialize<T>(T objectToSerialize) 

2)使用对象,那么的GetType我希望我的理解问题以及足够的帮助。

+0

显然我犯了一个错误,在我的问题中将关于我的意图的信息与这些类相关联。请忽略序列化程序。问题是:“如何将一个类解析为函数作为参数?” – dllhell

+0

您可以将“类的实例”传递给函数,也可以将类的“类型”传递给函数。 GetType()这样做。 –

0

也许这里的另一个解决方案是使用所有类继承的接口。

Public interface IMyfunctionInterface 
{ 
    public MyFunction(); 
} 

然后你可以做这样的事情与您的所有课程,从这个接口继承:

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

只是一个想法...