문제
동일한 방식으로 생성 된 MDI 하위 노드가 많이 있으며 중복 코드를 줄이기 위해 메소드를 호출하고 문자열 (하위 노드의 이름)을 전달하고 노드를 만들고 노드를 만들 수 있습니다. 부모에게 추가하십시오.
클래스 이름 문자열에서 클래스를 만드는 것 외에는 모든 작업을 수행 할 수 있습니다. 어떻게해야합니까?
해결책
나는 현재 내 응용 프로그램 중 하나에서 이것을 New Up a Class에 사용하고 있습니다.
public static IMobileAdapter CreateAdapter(Type AdapterType)
{
return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}
Imobileadapter를 구현하는 클래스의 인스턴스를 반환하지만 문자열로 똑같이 쉽게 사용할 수 있습니다.
public static IMyClassInterface CreateClass(string MyClassType)
{
return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}
다음과 유사한 코드를 사용하여 호출하십시오.
IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");
물론,이 경우 생성 된 클래스는이 경우 인터페이스 ImyClassInterface를 구현해야하지만 클래스 공장을 사용하면 모든 클래스에 동일한 인터페이스를 구현할 수 있습니다.
편집하다:
귀하의 의견과 관련하여,이 논의의 목적을 위해, "어셈블리"라는 용어를 VB/CS 프로젝트 내의 파일 세트로 생각하십시오. 나는 당신이 단일 프로젝트 [어셈블리] 내 에서이 모든 것을 수행하고 있으며 여러 프로젝트에 퍼지지 않는다고 가정합니다.
귀하의 경우 클래스가 양식 개체를 확장 할 경우 이와 같은 일을 할 것입니다.
Form myInst = CreateClass("MyExtendedForm");
또는
Form myInst = CreateClass(Type.GetType("MyExtendedForm"));
CreateClass 메소드 내에서 또는 외부에서 유형을 얻는 지 여부에 따라. 사용자 정의 멤버에 액세스하려면 인스턴스를 올바른 유형으로 캐스트해야합니다. 이걸 고려하세요:
class MyCustomForm : Form
{
public int myCustomField{ get; set; }
}
MyCustomfield 속성을 추가하는 양식을 확장하는 사용자 정의 양식이 있습니다. Activator.createInstance ()를 사용하여 이것을 인스턴스화하고 싶습니다.
public static Form CreateClass(string InstanceName)
{
return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}
그런 다음 사용합니다.
Form myInst = CreateClass("MyCustomForm");
이제 MyInst에 사용자 정의 양식이 저장되어 있습니다. 그러나 사용자 정의 속성 [Mycustomfield]에 액세스하려면 인스턴스를 올바른 양식으로 캐스팅해야합니다.
int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;
다른 팁
Activator.CreateInstance(Type.GetType(typeName))
클래스의 이름 인 문자열이있는 경우 유형을 호출하여 유형 객체를 가져올 수 있어야합니다. 이 유형에서 반사를 사용하여 객체를 생성 할 수 있어야합니다.