あなたが本当に欲しいのであれば、それを反映させることはできますが、パフォーマンス上の罰則があります。彼らが重要かどうかは、あなたの正確な状況に左右されます。
あなたが何をしたいのかによって、スイッチ/ケースのステートメントまたはマップのいずれかをお勧めします。特に、構築している型に基づいて異なるコンストラクタに異なる引数を渡す必要がある場合には便利です。リフレクションで行うことは、すでに別の種類の特殊なケースになっているという点では苦労します。
EDIT:これで、パラメータのないコンストラクタが常に存在することがわかりました。その場合には、(それらはすべて同じ名前空間にいる場合)あなたの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"を参照してください。 –
クラスには常にパラメータのないコンストラクタがありますか? –