如果你真的想要,你可以用反射來做,但會有性能懲罰。它們是否重要取決於你的確切情況。正如你所建議的那樣,根據你想要做的事情,我很可能會使用switch/case語句或地圖。尤其是,如果您需要根據您構建的類型將不同的參數傳遞給不同的構造函數,那麼這將非常有用 - 通過反射來實現這一點會有點痛苦,因爲您已經是特殊框架的不同類型。
編輯:好的,所以我們現在知道總會有一個無參數的構造函數。在這種情況下,你的JSON可以很容易地包含在類名沒有命名空間(如果他們都在同一個命名空間)和你的方法可能是這個樣子:
public FooParent CreateFoo(string name)
{
if (name == null)
{
throw new ArgumentNullException("name");
}
string fullName = "Some.NameSpace." + name;
// This is assuming that the type will be in the same assembly
// as the call. If that's not the case, we can look at that later.
Type type = Type.GetType(fullName);
if (type == null)
{
throw new ArgumentException("No such type: " + type);
}
if (!typeof(FooParent).IsAssignableFrom(type))
{
throw new ArgumentException("Type " + type +
" is not compatible with FooParent.");
}
return (FooParent) Activator.CreateInstance(type);
}
你在哪裏確定名稱使用?
public FooParent CreateFoo(string name)
{
switch (name)
{
case "Foo1": return new Foo1();
case "Foo2": return new Foo2();
case "Foo3": return new Foo3();
case "Foo4": return new Foo4();
case "FooChild1": return new FooChild1();
default:
throw new ArgumentException("Unknown Foo class: " + name);
}
}
你要知道,剛剛寫了出來,我不知道它有什麼實際的好處(比其他:如果在某處真實過去了,重新格式化從規範稍微離開時,switch語句可以很簡單性能)優於使用Type.GetType(name)
,然後使用Activator.CreateInstance(type)
。
來電者如何知道要通過的類名?這絕對是動態的嗎?有沒有可能使用泛型?你可以告訴我們有關情況的信息越多,我們就可以得到更多幫助。
查找「Activator.CreateInstance」。 – 2009-08-15 19:41:00
該類是否總是有一個無參數的構造函數? – 2009-08-15 20:11:07