문제

동일한 방식으로 생성 된 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))

클래스의 이름 인 문자열이있는 경우 유형을 호출하여 유형 객체를 가져올 수 있어야합니다. 이 유형에서 반사를 사용하여 객체를 생성 할 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top