2012-07-17 44 views
2

以下代码的执行没有错误并输出“在一些”,这意味着该语句无法通过对象引用来访问一个类的成员

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

调用函数some它是foo的成员对象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

但是,当我们取消注释代码的最后一行,并尝试编译它,它会产生一个错误。为什么??

因为你已经声明oSystem.Object,它不具有可变i它尽可能的编译器而言定义。您需要将其转换为已知类型,或使用反射来检索此值。

例如:

// 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

你需要转换ofoo为了执行它。

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

C#是一种静态类型(类型安全的)语言,并且只允许键入 安全操作和作为有 类的无public构件iobject因此它不被编译器允许的。

1

o是对象类型可容纳对象的任何类型,但是实例的object不能访问assigned类对象的属性。

将类型转换为其相应的类使公共成员可以像这样访问。

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