2012-11-04 3 views
1

폼을 표시하기 위해 제네릭을 만들고 싶습니다. 폼이 이미 열려 있는지 확인하고, 그렇다면 양식의 새 인스턴스를 만들고 표시하지 않을 경우 맨 위로 가져 오는 기능을 원합니다.C#에서 객체에 캐스팅 유형 캐스팅

양식이 열려 있는지 확인하는 첫 번째 부분은 모두 좋지만 T에서 캐스팅하고 T 형식의 새 양식 개체를 만듭니다.이 코드 줄을 사용하여 obj = Activator.CreateInstance<T>(); 형식의 인스턴스를 만들었지 만 그것은 인텔리 센스의 모든 메소드와 속성을 보여주지는 않습니다. 코드 Form x = new Form1. x에는 모든 메소드와 속성이 표시됩니다.

나는 틀린 무엇인가 잘못하고있다라고 확신하고있다 어떤 빛이라도 나를 위해 약간의 빛을 비춘다. 당신이 Form 또는베이스에 정의 된 모든 멤버를 사용할 수 있습니다,

private static void ShowForm<T>() where T : Form, new() 

를 컴파일러가 TForm을 상속 보장 것을 알고 나면 :

 private static void ShowForm<T>() 
    { 
     T obj = default(T); 

     List<T> opened = FormManager.GetListOfOpenForms<T>(); 
     if (opened.Count == 0) 
     { 
      // not opened 

      // obj does not show all properties and methods 
      obj = Activator.CreateInstance<T>(); 


      // x shows all properties and methods 
      frmLogin x = new frmLogin(); 

     } 
     else 
     { 
      // opened 

     } 

    } 

답변

5

당신은 Form을 상속 T를 제한 할 필요가 수업.

귀하의 질문에 대한 일반적인 대답은 objForm 번으로 작성하는 것입니다.

+0

매개 변수가없는 생성자에 대한 제약이 실제로 그렇게 유용합니까? – LightStriker

+0

+1. @ LiteStriker, 네, 그것은 CreateInstance에 대한 불필요한 리플렉션 호출을 제거 할 수 있습니다. –

+0

@AlexeiLevenkov : 사실,'new T()'는 Activator.CreateInstance로 컴파일됩니다. 이 제약 조건은 런타임 오류를 컴파일 타임 오류로 변환합니다. – SLaks