Вы можете сделать это с отражением, если хотите, но будут штрафы за производительность. Являются ли они значительными или нет, будут зависеть от вашей точной ситуации.
В зависимости от того, что вы хотите сделать, я бы вполне мог пойти с оператором switch/case или с картой, как вы предлагаете. В частности, это было бы полезно, если бы вам нужно было передать разные аргументы различным конструкторам на основе типа, который вы строите, - делая это через отражение, было бы немного болью в том, что вы уже были бы специальными корпусами разных типов.
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);
}
}
Имейте в виду, только что написано, что из Я не уверен, что это имеет какое-либо реальной пользы (кроме) с использованием Type.GetType(name)
, а затем Activator.CreateInstance(type)
.
Каким образом вызывающий абонент узнает имя класса? Будет ли это определенно динамичным? Есть ли вероятность, что вы можете использовать дженерики? Чем больше вы могли бы рассказать нам о ситуации, тем полезнее было бы.
Посмотрите «Activator.CreateInstance». –
Будет ли класс всегда иметь конструктор без параметров? –