2012-06-22 75 views
4

我希望你能給我一個這方面的幫助。它已經困擾了我很長一段時間了。我在網上找不到確鑿的答案。我有一個簡單的類層次結構:帶有ClassA,ClassB和DefaultClass的BaseClass派生自它。它們都有一個像ClassA(輸入輸入)一樣的構造函數:base(input)...都非常簡單。現在,我有以下幾點工廠給定的關鍵字不存在於Activator.CreateInstance的字典中。

namespace mynamespace 
{ 
    public class Factory 
    { 

     public static Dictionary<string, Type> Map = 
     new Dictionary<string, Type> 
     { 
      {"ClassA", typeof(ClassA)}, 
      {"ClassB", typeof(ClassB)} 
     }; 
     public static BaseClass Create(Input input) 
     { 
      Type constructor; 
      try 
      { 
       constructor = Map[input.ClassType]; 
      } 
      catch (KeyNotFoundException) 
      { 
       constructor = typeof(DefaultClass); 
      } 
      return (BaseClass) Activator.CreateInstance(constructor, input); 
     } 
    } 
} 

正如你看到的,輸入對象的.ClassType成員決定實例化哪個類。這種類型的構造已經在我的獨立應用中用於簡單調用,如

var myClass = Factory.Create(input); 

。現在,我必須讓應用程序在服務器上運行,並且對Create方法的調用從客戶端接收一個序列化的輸入對象。我會說這是應用程序和沒有應用程序之間的唯一區別。現在,輸入是沿線

[DataContract] 
public class Input 
{ 
    [DataMember] public string ClassType; 
    [DataMember] public string member1; 
} 

wheras之前它沒有這樣的DataContract或DataMember註釋。那麼,現在代碼在Activator.CreateInstance行中崩潰,並且有一個例外「給定的鍵在字典中不存在」。你有任何線索爲什麼這可能是?唯一的區別是構造函數中的序列化對象。

非常感謝您的提前和問候。

+2

您應該使用Dictionary.TryGetValue而不是捕獲KeyNotFoundException。例外情況非常昂貴。 –

+0

你能發佈異常的堆棧跟蹤嗎? – svick

+0

我看不出Activator.CreateInstance如何拋出這樣的異常。它只能在行上被拋出構造函數= Map [input.ClassType] – Bond

回答

5

你提供的代碼片段應該可以正常工作。看看你的對象的構造函數。我確信異常會在其實現的某個地方引發。

我完全同意,最好使用Dictionary.TryGetValue()而不是捕獲異常。這裏是學習例外的有用鏈接:Exception Handling

+0

你是這是在構造函數中,乾杯,E – edd

+2

太好了,所以,請將我的答案標記爲已接受。 –

相關問題