정말 원한다면 반성으로 할 수 있지만 실적이 저하 될 수 있습니다. 그들이 중요한지 여부는 정확한 상황에 달려 있습니다.
정확히 무엇을하고 싶은지에 따라 스위치/케이스 문이나지도를 사용하는 것이 좋습니다. 특히 여러분이 구성하는 유형에 따라 다른 생성자에 다른 인수를 전달해야하는 경우 유용합니다. 리플렉션을 통해 수행하면 이미 다른 유형의 특수 케이스가 될 수 있다는 점에서 약간의 고통이됩니다.
편집 : 좋아요, 이제 매개 변수없는 생성자가 있다는 것을 알았습니다. 이 경우, (그들은 같은 공간에있는 모든하는 경우) 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"를 찾으십시오. –
클래스에는 항상 매개 변수없는 생성자가 있습니까? –