2011-08-04 4 views
3

폼의 이미 존재하는 인스턴스를 반환하는 함수를 빌드하고 싶습니다.폼의 인스턴스를 가져 오는 함수

fx = getForm(Form1); 

여기에 내가 오류 'FensterTest.Form1'가 '형'이지만 그래서 내가 약간의 캐스팅을 필요 '변수'처럼 사용 얻을,하지만 난 내가 캐스팅 필요에 아무 생각이 없습니다. 제가 사용 목적지 "찾을 수 없습니다 'F'형 또는 스페이스 이름"

private Form getForm(Form f) 
{ 
    foreach (Form a in Application.OpenForms) 
    { 
    if (a is f) 
    { 
     f fx = (f)a; 
     return fx; 
    } 
    } 
    return null; 
} 

와는 "F"는 제가

얻을

"F의 FX = (F)가 「 이전에는 "Form1 fx = (Form1) a;"였습니다. 그것은 꽤 잘 작동하지만 Form2 Form3을 사용해야하기 때문에 ...

+0

명확히하십시오 - 당신이 반환하는 양식 또는/기존 인스턴스의 _new_ 인스턴스를 원하는가? – Oded

+0

죄송합니다. 양식의 기존 인스턴스를 가져오고 싶습니다. "fx = getForm (Form1);" 나는 단지 어떤 형태의 인스턴스인지 말하고 싶다. – ralph

답변

4

OpenForms 컬렉션에서 특정 유형의 Form을 찾고 싶을 것입니다. 따라서 유형을 전달해야합니다. Type 오브젝트를 전달하거나 메소드를 일반화하여 유형 매개 변수를 전달할 수 있습니다. 형식 매개 변수를 보내는 것은 유형 안전성 (필요한 경우 필요할 때 검색 한 구체 유형을 반환)이라는 장점이 있습니다.

private TForm getForm<TForm>() 
    where TForm : Form 
{ 
    return (TForm)Application.OpenForms.OfType<TForm>().FirstOrDefault(); 
} 

주, OfTypeFirstOrDefault는 LINQ 확장 방법, 당신을 System.Linq를 가져올 수 있는지 확인입니다 : 여기에 일반적인 솔루션입니다. 사용과 같이 위의 방법

Form f = getForm<Form1>(); 
+1

당신은'where TForm : Form'을 추가 할 수 있습니다. –

+0

'where TForm : Form'을 추가하십시오. 어디서 무엇을합니까? – ralph

+1

@ralph, 여기서 TForm : Form은 제네릭 제약이므로 Form에서 파생 된 유형 만 전달할 수 있습니다. OpenForms 콜렉션에서 관련없는 유형을 검색 할 수 없도록하는 것이 향상된 유형 안전성입니다 (예 : 'getForm '전달). 이는 의미가 없습니다. 코드 샘플을 업데이트했습니다. – driis

관련 문제