2011-05-02 6 views
4

인터뷰에서 인터뷰 : 런타임에 클래스의 인스턴스를 만들고 코드를 통해 클래스의 모든 메서드를 호출 할 수 있습니까? 클래스 TestClass에 대한 샘플 코드는 내가 하나가 내가 이것을 보관하는 방법을 설명 할 수있는 런타임에이 클래스의 인스턴스를 생성하고 런타임에 모든 메서드와 속성을 호출 할 이제 아래우리는 런타임에 클래스의 인스턴스를 생성하고 코드를 통해 클래스의 모든 메소드를 호출 할 수 있습니까?

public class TestClass 
{ 
    public int ID 
    { 
     get; 
     set; 
    } 
    public string Name 
    { 
     get; 
     set; 
    } 
    public float Salary 
    { 
     get; 
     set; 
    } 
    public string Department 
    { 
     get; 
     set; 
    } 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
    public int Sub(int a, int b) 
    { 
     return a - b; 
    } 
}//end class 

입니다 . 2. 이런 식으로 메서드를 호출 할 때 어떤 이점이 있습니까?

+4

내가 아는 한, 인스턴스는 항상 런타임에 생성됩니다. –

+0

이 질문은 인터뷰에서 나에게 질문했습니다. 나는 그가 반성에 대해 알고 싶어한다고 생각합니다. 어떻게 우리가 반성을 통해 달성 할 수 있는지. – Vijjendra

답변

2

나는 그가 반사에 대해 묻고 있다고 생각합니다. 이 주제와 Google에 관한 많은 정보가 Google에 있습니다.
기본적으로이 작업을 수행하려는 이유는 컴파일 타임에 구체적인 유형을 알지 못하므로 런타임에 동적 유형을 찾아야하기 때문입니다.
한 가지 예는 플러그인이 특정 인터페이스를 구현해야하는 간단한 플러그인 시스템입니다. 런타임에 지정된 폴더에 모든 어셈블리를로드하고 리플렉션을 사용하여 인터페이스를 구현하는 클래스를 검색 한 다음 해당 클래스의 인스턴스를 만들고 그 클래스의 인스턴스를 호출합니다.

+0

예, 저는 반성에 관해 이야기하고 있습니다. 감사. – Vijjendra

4

예, 가능합니다.

인스턴스를 만들려면 다음을 사용 : 당신이에서 유형을 모를 때

classType.InvokeMember("Sub", BindingFlags.InvokeMethod, null, instance, new object[] { 23, 42 }); 

반사 (예를 들어) 사용됩니다 같은 instanceSub(23, 42) 보이는 호출 후

Type classType = Type.GetType("TestClass"); 
object instance = Activator.CreateInstance(classType); 

과 컴파일 시간과 (예 : 외부 dll, 플러그인 등) 런타임에 그들을 발견하고자.

+0

'Activator.CreateInstance'가'TestClass' 타입의 인스턴스를 반환한다는 것을 알고 있기 때문에,'InvokeMember'는 필요하지 않습니다. 맞습니까? –

+0

@ christoffer-lette :이 예제에서는 절대적으로. 실제 코드에서는 인스턴스 유형 InvokeMember를 알지 못합니다. –

+0

알려진 인터페이스 유형을 사용하거나 사용하지 않는 시나리오 (즉, 플러그인 아키텍처)에 대한 설명과 함께 해답을 제시하면 쉽게 10 명의 담당자가됩니다. :-) –

관련 문제