如何从类中获取“ReadOnly”或“WriteOnly”属性?

Posted

技术标签:

【中文标题】如何从类中获取“ReadOnly”或“WriteOnly”属性?【英文标题】:How to get 'ReadOnly' or 'WriteOnly' properties from a class? 【发布时间】:2013-03-04 13:52:39 【问题描述】:

我需要从 MyClass 中获取属性列表,不包括“只读”属性,我可以获取它们吗?

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 上有几个属性表明可读/写能力 myProperties.IsReadOnly 是 PropertyInfo[] 属性之一 仅供参考:BindingFlags.SetProperty 在这种情况下不会做任何事情。 【参考方案1】:

您不能使用 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");

【讨论】:

抱歉,我忘记了排序请求 - 您希望它们如何排序?通过读\写、只读、只写,还是按名称等? 如果你能举出你所说的例子,我将非常感激。 我现在明白了,PropertyInfo[] ... .Where(p => p.CanWrite).OrderBy(x => x.Name).ToArray(); 在这种情况下包含BindingFlags.SetProperty 没有用,是吗?除此之外,GetProperties().Where(p => p.CanWrite) 或者 Where(p => p.CanRead && p.CanWrite) 是一个很好的解决方案。

以上是关于如何从类中获取“ReadOnly”或“WriteOnly”属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何从类中获取二元运算符?

从类中获取价值到另一个 Python

从类中的串行端口访问 WinForms 控件

从类中获取可为空的 var

您可以从类中获取实例变量名称吗? [复制]

Javascript - 从数组中查找所有类,从类中获取并返回内部文本