【问题标题】:C# Reflection method GetProperties(BindingFlags.Instance) not returning child class objectsC# 反射方法 GetProperties(BindingFlags.Instance) 不返回子类对象
【发布时间】:2020-03-25 03:25:08
【问题描述】:

我正在尝试检索对象的子类,同时忽略原始类型。

   public class Dog
    {
    public int Id {get;set;}
    public int Name {get;set;}
    public Breed Breed {get;set;}
    }

var dog = new Dog(); var children = dog.GetType().GetProperties(BindingFlags.Instance);

为什么 children 数组不包含品种属性?

【问题讨论】:

  • 尝试将BindingFlags.InstanceBindingFlags.Public 一起使用:var children = dog.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 或与BindingFlags.PublicBindingFlags.NonPublic 一起使用:var children = dog.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

标签: c# reflection


【解决方案1】:

通过仅提供BindingFlags.Instance,您根本无法获得任何属性,因为您没有发送任何访问修饰符谓词。

根据您的需要,将这些标志与按位或运算符|结合起来

您可以在此处找到文档:https://docs.microsoft.com/en-us/dotnet/api/system.reflection.bindingflags?view=netframework-4.8

var children = dog.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

编辑:

不幸的是,枚举没有任何值用于根据值类型过滤属性。为了使这成为一个完整的答案,过滤到仅包含 Breed 属性的数组由 @const-phi 贡献:

var result = children.Where(c => c.PropertyType.IsClass).ToArray(); // Const Phi 

【讨论】:

  • 您的答案返回所有属性,而我的目标是仅返回品种属性。这不就是 Instance 约束的用途吗?
  • 那么(我怎么看)你应该像这样使用过滤器:var result = children.Where(c => c.PropertyType.IsClass).ToArray();
  • 没有。属性类型没有限制。您应该过滤结果。并且@constphi 已经巧妙地将其作为一个简单的 linq 语句
  • 谢谢Const Phi,这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多