我希望你能給我一個這方面的幫助。它已經困擾了我很長一段時間了。我在網上找不到確鑿的答案。我有一個簡單的類層次結構:帶有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行中崩潰,並且有一個例外「給定的鍵在字典中不存在」。你有任何線索爲什麼這可能是?唯一的區別是構造函數中的序列化對象。
非常感謝您的提前和問候。
您應該使用Dictionary.TryGetValue而不是捕獲KeyNotFoundException。例外情況非常昂貴。 –
你能發佈異常的堆棧跟蹤嗎? – svick
我看不出Activator.CreateInstance如何拋出這樣的異常。它只能在行上被拋出構造函數= Map [input.ClassType] – Bond