2012-10-23 2 views
1

나는이 답변을 찾으려고했지만 가장 가까운 것을 찾았습니다 : Create an instance of a class from a string하지만 내 질문에 대답하지 않습니다 :C#에서 전달 된 문자열을 사용하여 함수에서 객체를 만들려면 어떻게해야합니까?

어떻게 클래스의 인스턴스를 만들 수 있습니까? 문자열, 예. WinForms 개체를 만들고 MDI에 추가하려고합니다.

인스턴스에 대해 문자열 (formname) (예 : "Form1")을 허용하고 MDI 하위에서 인스턴스를 확인하는 함수가 있습니다. 포커스가있는 경우 포커스를 설정하고, 그렇지 않으면 인스턴스를 만들어 하위에 추가합니다.

현재 양식을 만드는 방법은 사례 문과 함께하지만 새 양식을 프로젝트에 추가 할 때마다이를 업데이트해야합니다! 전달 된 문자열을 기반으로 MDI 하위 클래스에 Form 클래스의 인스턴스를 추가하는 방법이 있습니까? 예 : 의사 코드 :

함수 호출 : openForm ("Form2"); 이 같은

public void openForm(String formname) 
{ 
    if form exists in MDI children 
    { 
     focus form with name = formname; 
    } 
    else 
    { 
     MDIChildren.add(CreateInstanceOfClassNamed(formname)); 
    } 
} 
+0

왜 Activator.CreateInstance가 도움이됩니까? 어디가 부족합니까? 정교한. = –

+0

@ J.Steen 첫 번째 문장의 예제에서 대답은 Activator.CreateInstance입니다. 하지만 객체 유형으로 변환됩니다. ReportClass report = (ReportClass) Activator.CreateInstance (Type.GetType() reportClass)); 저는 이것을 이해하지 못합니다 - 유형을 이미 알고있는 것으로 보입니다 (ReportClass). 그래서 Type.GetType (reportClass)에서 반환 된 유형이 (ReportClass2) 인 경우이 경우 작동하지 않습니다. 또는 아마도 나는 그것을 정확하게 이해하지 않고있다? – Rick

+0

당신이 알아야 할 것은 Form이 상속된다는 것입니다. MDIChildren은 해당 유형을 받아 들여야합니다. –

답변

1

시도 뭔가 (의사, MDI 물건에 대한 단서)

public void openForm(String formTypeName) 
{ 
    Form FocusForm = null; 
    Type formType = Type.GetType(formTypeName); 
    foreach (var form in MDIChildren) 
    { 
     if (form.GetType() == formType) 
     { 
      focusForm = form; 
      break; 
     } 
    } 
    if (focusForm == null) 
    { 
     MDIChildren.add(Activator.CreateInstance(formType)); 
    } 
    // set focus to focusForm 
} 
+0

이게 더 비슷해 보입니다. 다른 예제는 하드 코딩 된 타입으로 직접적으로 캐스팅되었습니다.이 타입은 오브젝트를 물리 칠 것 같았지만 필요한 것보다 더 비슷하게 보입니다. 나는 그것을 시도하고 다시 당신에게 돌아갈 것입니다. – Rick

0

Activator 클래스 이름에서 객체 생성 할 수 있습니다 :

object obj = Activator.CreateInstance(Type.GetType(assemblyname + "." +formname)); 

    ((Form)obj).ShowDialog(); 
0

보다는 문자열을 전달 당신은 할 수 기능을 일반화하십시오 :

public TForm GetForm<TForm>() 
    where TForm : Form, new() 
{ 
    TForm existingChild = MDIChildren.OfType<TForm>().FirstOrDefult(); 
    if(existingChild != null) 
    { 
    //focus, or do whatever 
    return existingChild; 
    } 
    else 
    { 
    TForm newChild = new TForm(); 
    //do stuff with new child 
    return newChild; 
    } 
} 

이렇게하면 Form이 아니거나 전혀 형식이 아닌 클래스의 문자열 값을 전달하지 않도록 할 수 있습니다. 다음과 같이 부를 수 있습니다 :

Form2 newChild = GetForm<Form2>(); 
+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 저는 클래스로 존재하지 않는 문자열 값을 전달할 수 없다고 말하는 것처럼 아이디어를 좋아합니다. 현재 클래스의 이름을 보유하고있는 타사 양식 컨트롤을 사용하고 있습니다. 그래서 내가 클릭 할 때 그들은 내 함수를 호출하고 그들이 가지고있는 이름을 전달하므로 내가 당신의 솔루션을 사용할 수 있는지 확신 할 수 없지만 제네릭을 사용하는 것을 좋아할 것입니다 - 당신에게 알려 드리겠습니다! - 다시 한번 감사드립니다. – Rick

관련 문제