2012-07-17 6 views
2

어떤 진술다음 코드는 오류 및 지문 "일부</em>에서 <em>"없이 실행

m[0].Invoke(o, args); 

foo의 멤버 함수 some를 호출하는 수단의 오브젝트 참조를 통해 클래스의 멤버에 액세스 할 수 없다 클래스, 개체 o 및 해당 공용 변수 i 영향을줍니다. 그러나 코드의 마지막 줄의 주석 처리를 제거하고 컴파일하려고하면 오류가 발생합니다. 왜?? 우리는 코드의 마지막 행의 주석을 해제하고 컴파일 할 때

using System; 
using System.Reflection; 

class foo 
{ 
    public int i; 
    public foo(int ii = 0) 
    { 
     i = ii; 
    } 
    public void some(int ii) 
    { 
     i = ii; 
     Console.WriteLine("In some "); 
    } 
} 

class main 
{ 
    static public void Main() 
    { 
     foo f = new foo(); 
     object o = new foo(); 

     Type t = typeof(foo); 


     object[] args = new object[1]; 
     args[0] = 9; 
     MethodInfo[] m = t.GetMethods(); 
     m[0].Invoke(o, args); 
     //Console.WriteLine(o.i); 
    } 
} 

답변

4

는하지만, 그것은 오류가 발생합니다. 왜?? 당신이 변수 i가 멀리 컴파일러에 관한 한이 정의되어 있지 않습니다 System.Object, 같은 o를 선언했기 때문에

. 알려진 유형으로 변환하거나 리플렉션을 사용하여이 값을 가져와야합니다. 예를 들어

:

// You can cast here, since you know the type 
foo oAsFoo = o as foo; 
Console.WriteLine(oAsFoo.i); 

는 다른 방법으로, 사용 반사 값을 얻을 :

FieldInfo field = t.GetField("i"); 
Console.WriteLine(field.GetValue(o)); 
2

을 당신은 그것을 실행하기 위해 o 너무 foo 캐스팅해야합니다.

Console.WriteLine(((foo)o).i) 

C 번호가 정적 타입 (타입 안전한) 언어 만 안전한 동작을 입력 할 수 있으며, 클래스 전혀 public 부재 i 없기 때문에 object 따라서 그것은 컴파일러에 의해 허용되지 않는다.

1

oassigned 클래스 객체의 속성에 액세스 할 수있는 모든 유형의 개체 만 인스턴스의 object을 저장할 수있는 유형의 객체이다.

각 클래스에 대한 형 변환은 공개 멤버를 이와 같이 액세스 가능하게 만듭니다.

Console.WriteLine(((foo)o).i)