2

下面的代码执行没有错误并打印“ In some ”,这意味着该语句

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

在对象上调用作为类some成员的函数并影响其公共变量。但是当我们取消注释最后一行代码并尝试编译它时,它会产生错误。为什么??foooi

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

3 回答 3

4

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

因为您已声明o为,就编译器而言System.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));
于 2012-07-17T16:26:20.373 回答
2

您还需要强制o转换foo才能执行它。

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

C# 是一种静态类型(类型安全)语言,仅允许类型安全操作,并且由于没有类 public成员,因此编译器不允许使用。iobject

于 2012-07-17T16:26:42.233 回答
1

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

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

Console.WriteLine(((foo)o).i)
于 2012-07-17T16:27:14.227 回答