列出类的所有公共属性
本文关键字:属性 | 更新日期: 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-仅列出在精确类型上定义的成员,忽略任何继承的成员
最有可能的是,DisplayName
和ThrowOnInvalidPropertyName
属性是从基类继承的——添加DeclaredOnly
会过滤掉它们(但请注意,这也意味着,如果您从类派生出一个新类,那么您将再次只获得在那里定义的成员,而不是继承的成员)。
您可以简单地迭代所有公共属性,然后跳过您不感兴趣的属性:
foreach (var propertyInfo in usbconf.GetType().GetProperties())
{
if (propertyInfo.Name.Equals("DisplayName")
|| propertyInfo.Name.Equals("ThrowOnInvalidPropertyName"))
{
continue;
}
// your loop body goes here
}