web-dev-qa-db-ja.com

このリフレクションコードの何が問題になっていますか? GetFields()は空の配列を返しています

C#、Net 2.0

コードは次のとおりです(ドメイン固有のものをすべて取り出しても、空の配列が返されます)。

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ChildClass cc = new ChildClass();
            cc.OtherProperty = 1;

            FieldInfo[] fi = cc.GetType().GetFields();
            Console.WriteLine(fi.Length);
            Console.ReadLine();
        }
    }
    class BaseClass<T>
    {
        private int myVar;

        public int MyProperty
        {
            get { return myVar; }
            set { myVar = value; }
        }


    }

    class ChildClass : BaseClass<ChildClass>
    {
        private int myVar;

        public int OtherProperty
        {
            get { return myVar; }
            set { myVar = value; }
        }

    }
}
23
Chris McCall

パラメータのないGetFields()publicフィールドを返します。非公開のものが必要な場合は、以下を使用してください。

cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

または、必要な適切な組み合わせ-ただし、doInstanceStaticの少なくとも1つを指定する必要があります。そうしないと、どちらも見つかりません。すべてを取得するために、両方を指定でき、実際にはパブリックフィールドも指定できます。

cc.GetType().GetFields(BindingFlags.Instance | 
                       BindingFlags.Static |
                       BindingFlags.NonPublic |
                       BindingFlags.Public);
67
Jon Skeet

フィールドはプライベートであるため、 BindingFlags.NonPublic を指定できるGetFields()のオーバーロードを使用する必要があります。

これを機能させるには、次のように変更します。

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
11
Reed Copsey

プライベート(非パブリック)フィールドが必要であることを指定する必要があります

への変更:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
5
AgileJon