2010-06-21 137 views
3

我們正在使用可以動態公開Web服務的Microsoft ERP。服務產生的服務超出了我們的控制範圍。我們沒有說明如何創建和暴露對象,包括類型定義。當向Web服務添加或刪除新方法時,所有類型的枚舉都會重新編號,並且在更新到新定義之後,所有使用Web服務的方法都會被清除。所以基本上,解析動態枚舉

enumeration Type1 
    Item1 
    Item2 
    Item3 

...可能成爲

enumeration Type6 
    Item1 
    Item2 
    Item3 

...用枚舉類型名稱改變,但類型的成員保持靜止。該服務輸出的服務看起來與使用XSD.exe生成對象的最終結果完全相同。因此,無論何時有人在服務上公開新方法(通過ERP GUI),對象都會重建,按字母順序將類型分配給服務定義,重新展示,從而留下整個代碼庫。

我試圖使用反射來確定類型,然後將靜態成員解析到新的業務對象中,但它不起作用,因爲我無法在不知道類型的實際名稱的情況下鍵入枚舉類型。以下將無法使用。

System.Type t = service.BusinessObjectEnumeration.GetType(); 
service.SomeField = Enum.Parse(t,"Item1"); 

...因爲編譯器拋出一個錯誤,因爲我沒有明確地轉換枚舉。

任何想法如何在動態地將類型轉換爲正確的枚舉時解決此問題?

同樣,我不能修改服務公開的實際對象,只能修改訂閱服務的代碼。

感謝, 喬治

回答

7

重新示例代碼:

System.Type t = service.BusinessObjectEnumeration.GetType(); 
service.SomeField = Enum.Parse(t,"Item1"); 

或許要做到這一點的方法是通過反射:

var prop = service.GetType().GetProperty("SomeField"); 
prop.SetValue(service, Enum.Parse(prop.PropertyType, "Item1"), null); 
+0

我想,使用反射來檢索值和設置屬性是唯一可用的方式,給定OP約束。 當然這意味着即使使用這樣的枚舉作爲參數的方法也應該使用反射來調用(因爲它是不可知的調用參數類型)... – BladeWise 2010-07-05 07:16:36

0

爲什麼你需要分析的東西?
如果我正確理解Enums,它們傳遞值(而不是Enum本身)。

編輯:我的意思是,enum是不一樣的class。對於class,需要傳遞/接收實例。對於enum,它是其中一個或其成員的組合,以int值的形式傳遞。

編輯2:你是否試圖在這裏使用enum作爲某種struct?編輯3:你將不得不在調試模式下看到enum是什麼類型,以弄清楚如何反思它。

object enumValueReturned = service.BusinessObjectEnumeration; 

enumValueReturned在監視窗口&發揮它使用反射(GetMembers)看看,你會怎麼達到Item1

+0

-1您可能需要枚舉的名稱或字符串值的原因很多也許某些XML序列化保存了字符串值,也許它們用於填充下拉列表等,如果在中間添加新值,您想要掛在枚舉的名稱上。所有這些用途可能不是最聰明的做法,但它們仍然是實踐。 – SWeko 2010-06-21 14:52:23

+0

@Sweko:如何從webservice傳遞的枚舉值?它是否與實際值一起傳遞枚舉的整個元數據?我的意思是,當你尋找一個成員值時,Enum的意義何在? – shahkalpesh 2010-06-21 15:05:59

+0

當Web服務被引用時,在客戶端上生成Enum元數據,然後在運行時在請求/響應調用中使用該元數據。我同意,int對於web服務的使用來說更便於攜帶,但OP不能控制服務。 – SWeko 2010-06-21 16:11:14

1

我曾與導航Web服務類似的問題。我用來爲通過Nav公開的每個服務創建新Web引用的解決方案,而不僅僅是針對所有服務的一個服務。這樣可以避免您在使用反射或黑客時遇到的名稱衝突。