문자열 이름이 주어진 클래스를 어떻게 인스턴스화합니까?
추상 클래스가 있고이를 확장하는 클래스로 초기화하고 싶습니다.
자식 클래스 이름이 문자열로 있습니다.
게다가 ...
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).AssemblyQualifiedName
에 AssemblyName
실제로 오류가 발생했음을 발견했으며 작동하지 못했습니다. 나는 얻을 것이다 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
'Development Tip' 카테고리의 다른 글
WPF에서 너비를 100 %로 설정하는 방법 (0) | 2020.11.23 |
---|---|
NSSet을 정렬하는 가장 효율적인 방법은 무엇입니까? (0) | 2020.11.23 |
WPF TextBlock에 테두리 추가 (0) | 2020.11.23 |
파이썬 배열에서 짝수 / 홀수 줄을 자르는 가장 짧은 방법은 무엇입니까? (0) | 2020.11.23 |
Scala에서 사용자로부터 입력을받는 방법은 무엇입니까? (0) | 2020.11.23 |