我试图反映一个类型,并只获取公共setter的属性。这对我来说似乎没有用。在下面的示例LinqPad脚本中,'Id'和'InternalId'与'Hello'一起返回。我该怎么做才能过滤掉它们?
void Main()
{
typeof(X).GetProperties(BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance)
.Select (x => x.Name).Dump();
}
public class X
{
public virtual int Id { get; protected set;}
public virtual int InternalId { get; protected internal set;}
public virtual string Hello { get; set;}
}
答案 0 :(得分:4)
您可以使用GetSetMethod()来确定设置者是否公开。
例如:
typeof(X).GetProperties(BindingFlags.SetProperty |
BindingFlags.Public |
BindingFlags.Instance)
.Where(prop => prop.GetSetMethod() != null)
.Select (x => x.Name).Dump();
GetSetMethod()
返回方法的公共setter,如果没有,则返回null
。
由于属性可能具有与setter不同的可见性,因此需要通过setter方法可见性进行过滤。