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 に答える