2011-10-03 3 views
1

어셈블리를 검색하고 양식 인 클래스를 확인한 다음 해당 멤버를 확인하는 응용 프로그램을 실험 해 왔습니다.양식의 인스턴스를 생성 할 때 반사 오류가 발생했습니다.

내가 어셈블리를 조회하기 위해 사용하고있는 코드는 다음과 같습니다

코드가 Activator.CreateInstance(formType)을 것을 시도
using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace TestForm 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

내 문제입니다 : 내가 표준 양식을 조회하려면이 옵션을 사용하고

Assembly testAssembly = Assembly.LoadFile(assemblyPath); 

Type[] types = testAssembly.GetTypes(); 
textBox1.Text = ""; 

foreach (Type type in types) 
{ 
    if (type.Name.StartsWith("Form")) 
    { 
     textBox1.Text += type.Name + Environment.NewLine; 

     Type formType = testAssembly.GetType(); 
     Object form = Activator.CreateInstance(formType);  
     } 
} 

"No parameterless constructor defined for this object." 또한 'DeclaringMethod :'formType.DeclaringMethod '가'System.InvalidOperationException '유형의 예외를 던졌습니다'formType 확인 '에서 볼 수 있습니다.

양식에 표준 생성자가 있기 때문에 오류 메시지를 이해하지 못합니다. 정말 명확한 것이 누락 되었습니까?

편집 : type.Name은 코드가 Form1 인 것으로 인스턴스화하려고 시도하는 유형을 표시합니다.

+2

오류가있는 유형이며 다른 형식이 아닙니다. 전자 이름은'Form'으로 시작합니까? –

+0

type.Name.StartsWith ("Form") -이 형식이 양식인지 여부를 확인하는 최선의 방법이 아닙니다. – username

+0

@JonSkeet - 다른 형식이 될 수 있는지, 표준 Windows Form 프로젝트를 쿼리하고있는 어셈블리인지 잘 모르겠습니다. VS2010에서 생성되었습니다. – GrandMasterFlush

답변

5

 Object form = Activator.CreateInstance(type);  

을 BTW, I가 클래스의 이름을 사용하지 것이다 양식에서 파생 된 것이 있는지 확인하십시오. IsSubclassOf를 사용할 수 있습니다.

 type.IsSubclassOf(typeof(Form)); 
+0

아하, 빙고! 잘 보였다. 'formType'이 전혀 쓰이지 않는다는 것이 명확하지 않습니다 ... –

+0

그 모든 소란스럽고 오타였습니다. Francesco, 감사합니다. 내가 찾은 몇 가지 예제에 코드를 적용하고 있었고 실수로 입력 한 것처럼 보입니다. – GrandMasterFlush

1

개체 양식 = Activator.CreateInstance (유형);

 Type formType = testAssembly.GetType(); 
    Object form = Activator.CreateInstance(formType);  

당신은 수행해야합니다 : 당신은 아닌 형태, 총회의 인스턴스를 만들려고

관련 문제