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都被获取到了??
谢谢!
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);
}
Type t = typeof(object);
var pros = t.GetProperties(System.Reflection.BindingFlags.GetProperty);
这个倒还真的没有去深入探究过,怪不得版主大人没有用这个方法。
不过你的方法里还有一个BUG,假如这个类有一对方法就叫get_XXXX和set_XXXX,那也会被当作属性XXXX返回。
这个倒还真的没有去深入探究过,怪不得版主大人没有用这个方法。
不过你的方法里还有一个BUG,假如这个类有一对方法就叫get_XXXX和set_XXXX,那也会被当作属性XXXX返回。
那它就是一个属性。
这个倒还真的没有去深入探究过,怪不得版主大人没有用这个方法。
不过你的方法里还有一个BUG,假如这个类有一对方法就叫get_XXXX和set_XXXX,那也会被当作属性XXXX返回。
当然,方法的参数、返回值要符合约定。
即使get_XXXX和set_XXXX符合约定,仍旧不能把它当成是属性来用。
即使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 ""; }这样的代码是无法编译的。
应该也不用这么复杂了,PropertyInfo.GetSetMethod(true)可以返回非公共的set访问器,如果返回空值表示没有set方法。或者判断set方法的IsSpecialName属性是否为true就可以知道是用户定义的还是编译器生成的。