在一个课程中,我定义了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.如果有任何问题,请询问。
答案 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
这些意思是:
最有可能的是,DisplayName
和ThrowOnInvalidPropertyName
属性是从您的基类继承的 - 添加DeclaredOnly
过滤掉它们(但请注意,如果您派生了一个新类,这也意味着它从你的班级,你再次只能得到那里定义的成员,而不是继承的成员。)