2011-04-05 4 views
2

저는 리플렉션의 예를 이틀 동안 읽었으며 필요한 모든 것을 모두 모아서 만들 수는 없습니다. 실제로 "using System.Reflection"이 회색으로 표시 될 때까지 리플렉션을 사용하고 있다고 생각했습니다. :-)CSharp : 동적으로 클래스 (생성자 포함) 및 메서드를 호출하려면 어떻게해야합니까?

내 수업 이름과 그 안에 포함 된 방법을 포함하는 XML 파일이 있습니다. 메서드 나 이름의 순서가 변경 될 수 있습니다. 내가 그들을 읽으면 나는 그들을 실행할 수 있기를 원한다. 충분히 단순 해 보입니다.

나는 다음과 같은 테스트 코드를 가지고 :

// myClassName = "namespace.TransactionServices" 
    Type tb = Type.GetType(myClassName); 

    // Classes will always have the same constructor 
    object classInstance = Activator.CreateInstance (
     tb, 
     new object[] 
     { 
      authorization.apiKey, 
      authorization.userName, 
      testData.servicesEndPoint 
     }); 

    //Grab the method I want 

    //myMethodName = "GetVersion" 
    MethodInfo mymethod = tb.GetMethod(myMethodName); 
    // no parameters for this method call 
    object result = mymethod.Invoke(classInstance, null); 

TB는 null입니다. 나는 클래스를 생성하기위한 올바른 API를 얻으려고 애 쓰고 있었지만, 내가 가지고있는 나머지가 유효한지 알지 못한다.

제안 사항?

감사합니다.

편집 : 추가 된 네임 스페이스. Activator.CreateInstance가 생성자를 찾을 수없는 오류를 반환합니다. 거기에 있습니다.

+0

을 사용하여 기존 객체를 가져올 수 있습니까? 이 문제에 적합한 것처럼 들린다. –

답변

2

네임 스페이스를 포함하여 전체 클래스 이름을 지정 했습니까? 네임 스페이스가 없으면 결과는 null이됩니다.

+0

동적 인 인스턴스를 시도 했으니 까.하지만 어셈블리의 수식어가 필요하다고 생각하니? 예 : "MyAwesomeNamespace.WickedClassName, ReallyRadLibrary" –

+0

고맙습니다. 네임 스페이스를 추가했지만 이제 Activator.CreateInstance가 생성자를 찾을 수 없다는 오류를 반환합니다. 생성자는 거기에 있습니다 (같은 이름, 공용). – Jason

+0

@Jason, ctor 서명을 게시 할 수 있습니까? 매개 변수의 순서 및 유형을 확인/확정 할 수 있습니다. 오류에 관한 다른 세부 사항이 있습니까? –

3

클래스 이름은 해결하기 위해 정규화 된 이름 공간 (가능하면 네임 스페이스 및 어셈블리 포함)이어야합니다. 클래스가 현재 실행중인 어셈블리에 있음을 알고있는 경우 Assembly.GetExecutingAssembly()을 사용할 수 있습니다. .GetType()

0

GetType의 경우 정규화 된 이름을 제공해야합니다. CastleWindsor, Unity, NInject 또는 다른 Inversion of Control 컨테이너를 들여다 보았습니까?

MyObject.GetType().AssemblyQualifiedName; 
관련 문제