Why does GetProperty fail to find it?

2019-06-15 01:11发布

I'm trying to use reflection to get a property from a class. Here is some sample code of what I'm seeing:


using System.Reflection;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            PropertyInfo[] tmp2 = typeof(TestClass).GetProperties();
            PropertyInfo test = typeof(TestClass).GetProperty(
               "TestProp", BindingFlags.Public | BindingFlags.NonPublic);
        }
    }

    public class TestClass
    {
        public Int32 TestProp
        {
            get;
            set;
        }
    }
}

When I trace through this, this is what I see:

  • When I fetch all properties using GetProperties(), the resulting array has one entry, for property TestProp.
  • When I try to fetch TestProp using GetProperty(), I get null back.

I'm a little stumped; I haven't been able to find anything in the MSDN regarding GetProperty() to explain this result to me. Any help?

EDIT:

If I add BindingFlags.Instance to the GetProperties() call, no properties are found, period. This is more consistent, and leads me to believe that TestProp is not considered an instance property for some reason.

Why would that be? What do I need to do to the class for this property to be considered an instance property?

3条回答
趁早两清
2楼-- · 2019-06-15 01:40

Add BindingFlags.Instance to the GetProperty call.

EDIT: In response to comment...

The following code returns the property.

Note: It's a good idea to actually make your property do something before you try to retrieve it (VS2005) :)

using System.Reflection;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            PropertyInfo[] tmp2 = typeof(TestClass).GetProperties();
            PropertyInfo test = typeof(TestClass).GetProperty(
                "TestProp",
                BindingFlags.Instance | BindingFlags.Public |
                    BindingFlags.NonPublic);

            Console.WriteLine(test.Name);
        }
    }

    public class TestClass
    {
        public Int32 TestProp
        {
            get
            {
                return 0;
            }
            set
            {
            }
        }
    }
}
查看更多
The star\"
3楼-- · 2019-06-15 01:41

You need to specify whether it is static or an instance (or both) too.

查看更多
可以哭但决不认输i
4楼-- · 2019-06-15 01:53

Try to add the following tag:

System.Reflection.BindingFlags.Instance

EDIT: This works (at least to me)

PropertyInfo test = typeof(TestClass).GetProperty("TestProp", BindingFlags.Public | BindingFlags.Instance);

Console.WriteLine(test.Name);
查看更多
登录 后发表回答