Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列出类的所有公共属性_C#_Class_Variables - Fatal编程技术网

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,而不是相反。我从哪里获得了负分?:)是的,你有一个观点:)我在想如果有更优雅的解决方案:)是的,你有一个观点:)我在想如果有更优雅的解决方案:)