public class MyUser
    {
        private int _Id=1;
        public int Id
        {
            get { return _Id; }
        }
        private static int _Age;
        public static int Age
        {
            get { return _Age; }
            set { _Age = value; }
        }
    }
            BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.GetProperty;
            Type type = typeof(MyUser);
            foreach (System.Reflection.PropertyInfo property in type.GetProperties(flags))
            {
                Console.WriteLine(property.Name);
            }请教大家一下,
我只想反射类属性成员含Get方法的,上面的方法Id和Age都被获取到了??
谢谢!

解决方案 »

  1.   

    BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;
    Type type = typeof(MyUser);
    foreach (string propertyName in type.GetMethods(flags).Where(x => x.Name.StartsWith("get_") || x.Name.StartsWith("set_")).GroupBy(x => x.Name.Substring(4)).Where(x => x.Count() == 2).Select(x => x.Key))
    {
        Console.WriteLine(propertyName);
    }
      

  2.   


    Type t = typeof(object);
                var pros = t.GetProperties(System.Reflection.BindingFlags.GetProperty);
      

  3.   

    PropertyInfo.CanWrite
      

  4.   

    CanWrite应该不能处理私有set,比如string Value { get; private set; }
      

  5.   


    这个倒还真的没有去深入探究过,怪不得版主大人没有用这个方法。
    不过你的方法里还有一个BUG,假如这个类有一对方法就叫get_XXXX和set_XXXX,那也会被当作属性XXXX返回。
      

  6.   


    这个倒还真的没有去深入探究过,怪不得版主大人没有用这个方法。
    不过你的方法里还有一个BUG,假如这个类有一对方法就叫get_XXXX和set_XXXX,那也会被当作属性XXXX返回。
    那它就是一个属性。
      

  7.   


    这个倒还真的没有去深入探究过,怪不得版主大人没有用这个方法。
    不过你的方法里还有一个BUG,假如这个类有一对方法就叫get_XXXX和set_XXXX,那也会被当作属性XXXX返回。
    当然,方法的参数、返回值要符合约定。
      

  8.   


    即使get_XXXX和set_XXXX符合约定,仍旧不能把它当成是属性来用。
      

  9.   


    即使get_XXXX和set_XXXX符合约定,仍旧不能把它当成是属性来用。仔细看了一下,是的Property需要额外的Metadata,在IL层面需要如下定义
    .property instance string XXX()
    {
        .get instance string get_XXX()
        .set instance void set_XXX(string)
    }但是你提出的问题不难解决。
    只要判断有这么个属性,那么就可以断定 get_xxx set_xxx 一定是作为属性的方法。public string A { set { } }
    public string get_A() { return ""; }这样的代码是无法编译的。
      

  10.   


    应该也不用这么复杂了,PropertyInfo.GetSetMethod(true)可以返回非公共的set访问器,如果返回空值表示没有set方法。或者判断set方法的IsSpecialName属性是否为true就可以知道是用户定义的还是编译器生成的。