C# 解析类以用作参数

C# 解析类以用作参数,c#,web-services,asp.net-3.5,C#,Web Services,Asp.net 3.5,我有一些课程: public class clsAnimal { public int ID { get; set; } public string Strain { get; set; } } public class clsHybridom { public int ID { get; set; } public string H

我有一些课程:

    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; }
        }
object ReturnObject;
Session["clsAnimal"] = new clsAnimal();
ReturnObject = Activator.CreateInstance(((clsAnimal)Session["clsAnimal"]));

return clsDataProc.MyFunction(ReturnObject); 
这些类将实例化到会话中:

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

return clsDataProc.MyFunction(ReturnObject); 
并访问(如果存在更好的方法,请让我知道):

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

return clsDataProc.MyFunction(ReturnObject); 
有很多类似于这两个类的类,我有一个开关和请求实例化所需的类。实例类应解析为MyFunction

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

return clsDataProc.MyFunction(ReturnObject); 
有一个公共静态类,其函数用于整个项目,该类中应包含my functionMyFunction

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

return clsDataProc.MyFunction(ReturnObject); 
但是,唉!我不知道如何将这些类解析为functionMyFunction

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

return clsDataProc.MyFunction(ReturnObject); 
我的尝试是这样的:

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

return clsDataProc.MyFunction(ReturnObject); 
ASMX:

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

return clsDataProc.MyFunction(ReturnObject); 
公共静态类:

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();
    }
显然,这不会发生,因为:

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

return clsDataProc.MyFunction(ReturnObject); 
  • 无法从“clsAnimal”转换为“System.Type”
  • 匹配的最佳重载方法 “System.Activator.CreateInstance(System.Type,params对象[])”已被删除 一些无效的参数

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

听起来您好像在尝试用Xml将对象序列化为字符串。因此,您正在尝试构造System.Xml.Serialization.XmlSerializer。它想知道要序列化的对象的类型。如果您在编译时知道对象的类型(这似乎是您可以做到的),您可以这样做:

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

return clsDataProc.MyFunction(ReturnObject); 
clsAnimal a = ((clsAnimal)Session["clsAnimal"]);
var serializer = new XmlSerializer(typeof(clsAnimal));
serializer.Serialize(..., a);
在哪里。。。是你的StringStream还是别的什么。我想你已经把那部分搞定了。如果在编译时不知道类型,则使用GetType()

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

return clsDataProc.MyFunction(ReturnObject); 
如果要将其包装到函数中,有两种方法可以获取类型:

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

return clsDataProc.MyFunction(ReturnObject); 
1) 使用泛型。然后您可以得到类型为typeof(T):

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

return clsDataProc.MyFunction(ReturnObject); 

我希望我对这个问题理解得足够透彻,能有所帮助。

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

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

return clsDataProc.MyFunction(ReturnObject); 
Public interface IMyfunctionInterface
{
  public MyFunction();
}
然后,您可以对从该接口继承的所有类执行类似操作:

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

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

只是一个想法

为什么不将typeof(clsAnimal)作为第二个参数传递给xmlserializer?为什么不停止使用
cls
作为所有类的前缀?作为一个类并不是一件特别的事情,你需要给所有的类加前缀,只是为了提醒你它们是类。同意JohnSaunders的观点,使用类型安全编程语言的现代IDE匈牙利符号是荒谬的,在类型上更是如此……很明显,我把关于我的意图的信息放在我的问题中是一个错误。请忽略序列化程序。问题是:“如何将类作为参数解析为函数?”您可以将“类的实例”传递给函数,也可以将类的“类型”传递给函数。GetType()就是这样做的。
object ReturnObject;
Session["clsAnimal"] = new clsAnimal();
ReturnObject = Activator.CreateInstance(((clsAnimal)Session["clsAnimal"]));

return clsDataProc.MyFunction(ReturnObject);