当type.GetProperties()时过滤掉保护设置

本文关键字:过滤 保护 设置 type GetProperties | 更新日期: 2023-09-27 18:09:58

我试图反映一个类型,并获得只有公共设置的属性。这似乎不适合我。在下面的示例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;}
}

当type.GetProperties()时过滤掉保护设置

可以使用GetSetMethod()来确定setter是否为public。

例如:

typeof(X).GetProperties(BindingFlags.SetProperty |
                        BindingFlags.Public |
                        BindingFlags.Instance)
    .Where(prop => prop.GetSetMethod() != null)
    .Select (x => x.Name).Dump();

GetSetMethod()返回方法的公共setter,如果没有,则返回null

由于属性的可见性可能与setter不同,因此需要通过setter方法的可见性进行过滤。