2014-07-21 163 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(); 

只是一個想法...