列出类的所有公共属性

本文关键字:属性 | 更新日期: 2023-09-27 18:24:03

在一个类中,我定义了Auto Propertys,稍后我喜欢将其与值一起在列表中使用。

我当前的代码:

int klength = usbconf.GetType().GetProperties().Length;
for (int k = 0; k < klength-2; k++)
{
     var prop = usbconf.GetType().GetProperties();
     readinglist.Add(new MyList()
     {
          DataTag = (DataEnums)Enum.Parse(typeof(DataEnums), prop[k].Name),
          WriteByteArray = (byte[])prop[k].GetValue(usbconf),
     });
}

其中长度是56,而不是54,就像我想要的那样(54是我的特殊类中公共变量的神奇数量:)。还有我没有定义的列表集"DisplayName"answers"ThrowOnInvalidPropertyName"。如何将"Length"限制在54上-只选择没有"DisplayName"answers"Throw OnInvalidProperty Name"的Public。

我已经试过了:

var bindingFlags = BindingFlags.Public;
int klength = usbconf.GetType().GetProperties(bindingFlags).Length;
for (int k = 0; k < klength-2; k++)
{
     var prop = usbconf.GetType().GetProperties(bindingFlags);
     readinglist.Add(new MyList()
     {
          DataTag = (DataEnums)Enum.Parse(typeof(DataEnums), prop[k].Name),
          WriteByteArray = (byte[])prop[k].GetValue(usbconf),
     });
}

但是,我没有得到任何结果,并且Length返回0。如果有任何问题,请提问。

列出类的所有公共属性

您想要的绑定标志是

BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly

这些意味着:

  • 公开-列出公开成员
  • 实例-列出实例成员
  • DeclaredOnly-仅列出在精确类型上定义的成员,忽略任何继承的成员

最有可能的是,DisplayNameThrowOnInvalidPropertyName属性是从基类继承的——添加DeclaredOnly会过滤掉它们(但请注意,这也意味着,如果您从类派生出一个新类,那么您将再次只获得在那里定义的成员,而不是继承的成员)。

您可以简单地迭代所有公共属性,然后跳过您不感兴趣的属性:

foreach (var propertyInfo in usbconf.GetType().GetProperties())
{
    if (propertyInfo.Name.Equals("DisplayName")
        || propertyInfo.Name.Equals("ThrowOnInvalidPropertyName"))
    {
        continue;
    }
    // your loop body goes here
}