如何从一个类中获取“只读”或“只写”属性?

9

我需要从 MyClass 中获取属性列表,排除 'readonly' 属性,我能做到吗?

public class MyClass
{
   public string Name { get; set; }
   public int Tracks { get; set; }
   public int Count { get; }
   public DateTime SomeDate { set; }
}

public class AnotherClass
{
    public void Some()
    {
        MyClass c = new MyClass();

        PropertyInfo[] myProperties = c.GetType().
                                      GetProperties(BindingFlags.Public |
                                                    BindingFlags.SetProperty |
                                                    BindingFlags.Instance);
        // what combination of flags should I use to get 'readonly' (or 'writeonly')
        // properties?
    }
}

最后,我可以把它们排序吗?我知道可以添加OrderBy<>,但如何操作呢?我只是使用扩展。 提前致谢。

PropertyInfo 上有一些属性,指示其可读/可写性。 - Sam Axe
myProperties.IsReadOnly 是 PropertyInfo[] 属性之一。 - MethodMan
FYI:在这种情况下,BindingFlags.SetProperty 没有任何作用。 - Tim Pohlmann
1个回答

13

您不能使用BindingFlags指定只读或只写属性,但可以枚举返回的属性,然后测试PropertyInfo的CanRead和CanWrite属性,如下所示:

PropertyInfo[] myProperties = c.GetType().GetProperties(BindingFlags.Public |
                                                    BindingFlags.SetProperty |
                                                    BindingFlags.Instance);

foreach (PropertyInfo item in myProperties)
{
    if (item.CanRead)
        Console.Write("Can read");

    if (item.CanWrite)
        Console.Write("Can write");
}

抱歉,我忘记了排序请求 - 您希望它们按读/写、只读、只写或按名称等方式进行排序? - Martin
如果您能为所说的一切提供示例,我将非常感激。 - Shin
4
现在我明白了,PropertyInfo[] ... .Where(p => p.CanWrite).OrderBy(x => x.Name).ToArray(); 意思是在PropertyInfo数组中筛选出可写的属性,按照属性名称进行排序,最后转化为数组。 - Shin
1
在这种情况下,包含 BindingFlags.SetProperty 是没有用的,对吧?除此之外,GetProperties().Where(p => p.CanWrite) 或者 Where(p => p.CanRead && p.CanWrite) 是一个好的解决方案。 - Jeppe Stig Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接