C# 列出类的所有公共属性
在一个类中,我定义了自动属性,我喜欢在后面的列表中将其与值一起使用 我当前的代码:C# 列出类的所有公共属性,c#,class,variables,C#,Class,Variables,在一个类中,我定义了自动属性,我喜欢在后面的列表中将其与值一起使用 我当前的代码: int klength = usbconf.GetType().GetProperties().Length; for (int k = 0; k < klength-2; k++) { var prop = usbconf.GetType().GetProperties(); readinglist.Add(new MyList() { DataTag
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),
});
}
int klength=usbconf.GetType().GetProperties().Length;
对于(int k=0;k
其中长度是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),
});
}
var bindingFlags=bindingFlags.Public;
int klength=usbconf.GetType().GetProperties(bindingFlags).Length;
对于(int k=0;k
但是,我没有得到任何结果,
Length
返回0。如果有任何问题,请提问。您可以简单地迭代所有公共属性,跳过您不感兴趣的属性:
foreach (var propertyInfo in usbconf.GetType().GetProperties())
{
if (propertyInfo.Name.Equals("DisplayName")
|| propertyInfo.Name.Equals("ThrowOnInvalidPropertyName"))
{
continue;
}
// your loop body goes here
}
您可以简单地迭代所有公共属性,只需跳过您不感兴趣的属性:
foreach (var propertyInfo in usbconf.GetType().GetProperties())
{
if (propertyInfo.Name.Equals("DisplayName")
|| propertyInfo.Name.Equals("ThrowOnInvalidPropertyName"))
{
continue;
}
// your loop body goes here
}
您需要的绑定标志是
BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly
这意味着:
- 公众-列出公众成员
- 实例-列出实例成员
- DeclaredOnly-仅列出在确切类型上定义的成员,而不考虑任何继承的成员
最有可能的是,
DisplayName
和ThrowOnInvalidPropertyName
属性是从基类继承的-添加DeclaredOnly
会将它们过滤掉(但请注意,这也意味着如果您从类派生新类,您将再次只获得在那里定义的成员,而不是继承的成员).您需要的绑定标志是
BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly
这意味着:
- 公众-列出公众成员
- 实例-列出实例成员
- DeclaredOnly-仅列出在确切类型上定义的成员,而不考虑任何继承的成员
最有可能的是,
DisplayName
和ThrowOnInvalidPropertyName
属性是从基类继承的-添加DeclaredOnly
会将它们过滤掉(但请注意,这也意味着如果您从类派生新类,您将再次只获得在那里定义的成员,而不是继承的成员).@Jdsfighter:不,自动属性仍然是真正的属性。哎呀,我说错了,我以前也处理过类似的问题,结果我把GetProperties的GetFields翻过来了,反之亦然。我从哪一个获得了减分?:)@Jdsfighter:不,自动属性仍然是真正的属性。哎呀,我说错了,我过去也处理过类似的问题,结果我翻转了GetProperties的GetFields,而不是相反。我从哪里获得了负分?:)是的,你有一个观点:)我在想如果有更优雅的解决方案:)是的,你有一个观点:)我在想如果有更优雅的解决方案:)