列出类的所有公共属性

时间:2015-11-24 14:17:13

标签: c# class variables

在一个课程中,我定义了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”和“ThrowOnInvalidPropertyName”,我没有定义它。如何限制54上的“长度” - 只选择没有“DisplayName”和“ThrowOnInvalidPropertyName”的公共文件。

我已经尝试过了:

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.如果有任何问题,请询问。

2 个答案:

答案 0 :(得分:1)

您可以简单地遍历所有公共属性,只需跳过您不感兴趣的公共属性:

foreach (var propertyInfo in usbconf.GetType().GetProperties())
{
    if (propertyInfo.Name.Equals("DisplayName")
        || propertyInfo.Name.Equals("ThrowOnInvalidPropertyName"))
    {
        continue;
    }

    // your loop body goes here
}

答案 1 :(得分:1)

您想要的绑定标志是

BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly

这些意思是:

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

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