Development Tip

문자열 이름이 주어진 클래스를 어떻게 인스턴스화합니까?

yourdevel 2020. 11. 23. 20:17
반응형

문자열 이름이 주어진 클래스를 어떻게 인스턴스화합니까?


추상 클래스가 있고이를 확장하는 클래스로 초기화하고 싶습니다.

자식 클래스 이름이 문자열로 있습니다.

게다가 ...

String childClassString;
MyAbstractClass myObject;

if (childClassString = "myExtenedObjectA")
    myObject = new ExtenedObjectA();
if (childClassString = "myExtenedObjectB")
    myObject = new ExtenedObjectB();

어떻게 할 수 있습니까? 기본적으로 여기서 if 문을 어떻게 제거합니까?


Activator.CreateInstance ()를보십시오.

myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName");

또는

var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);

나는 이것이 효과가 있다고 믿는다.

myObject = (MyAbstractClass)Activator.CreateInstance(null, childClassString);

null조립체 실행하는 현재의 제 1 파라미터 디폴트된다. 더 많은 참조 : MSDN

편집 : 캐스트하는 것을 잊었습니다. MyAbstractClass


다른 어셈블리에서 개체를 인스턴스화하려고 시도했기 때문에 여기에 일부 답변을 구현하는 데 어려움이있었습니다 (그러나 동일한 솔루션에서). 그래서 나는 내가 찾은 것을 게시 할 것이라고 생각했다.

첫째,이 Activator.CreateInstance메서드에는 여러 가지 오버로드가 있습니다. 를 호출 Activator.CreateInstance(Type.GetType("MyObj"))하면 개체가 현재 어셈블리에 정의되어 있다고 가정하고 MyObj.

여기에있는 답변에서 권장하는대로 호출하면 Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName), 대신를 반환하며 객체를 가져 오려면 ObjectHandle호출 Unwrap()해야합니다. 이 오버로드는 다른 어셈블리에 정의 된 메서드를 호출하려고 할 때 유용합니다 (BTW, 현재 어셈블리에서이 오버로드를 사용할 수 있으며 AssemblyName매개 변수를 null로 두면됩니다 ).

이제 위의 제안 typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedNameAssemblyName실제로 오류가 발생했음을 발견했으며 작동하지 못했습니다. 나는 얻을 것이다 System.IO.FileLoadException(파일이나 어셈블리를로드 할 수 없다 ...).

내가 일하게 된 것은 다음과 같습니다.

var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();

참고 URL : https://stackoverflow.com/questions/2247598/how-do-i-instantiate-a-class-given-its-string-name

반응형