5

我试图反映一种类型,并且只获取具有公共设置器的属性。这似乎对我不起作用。在下面的示例 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;}
}
4

1 回答 1

5

您可以使用GetSetMethod()来确定 setter 是否是公共的。

例如:

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

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

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

于 2011-09-26T17:25:49.127 回答