如何在C#.NET Core中递归查找特定类型属性中使用的所有类型?

时间:2017-02-18 06:49:17

标签: c#

请参阅此代码

@Component({
selector: 'simple',
  template: `
    <div (click)="onClick()">
      {{myData[0].name}}
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class Simple {
  public @Input() myData;
  constructor() {
  }
  public onClick() {

  }
}

如何递归查找特定类型属性中使用的所有类型? 例如

GetAllInternalTypes(typeof运算(经理))

经理的结果:(经理=&gt;用户=&gt;人)

  • INT
  • 用户
  • 列表与LT;用户&gt;
  • 列表与LT; string&gt;
  • 字符串
  • 日期时间
  • 词典&LT; long,float&gt;

我希望递归地找到所有使用的特定类型的类型。

1 个答案:

答案 0 :(得分:0)

你的问题有点棘手。因为您只想获取不是以.Net库类型构建的类型的属性。例如DictionaryStringDateTimeArray等,您有自己想要排除的属性。幸运的是,有很多方法可以知道type是您定义的类型还是来自System库。

How to determine if a object type is a built in system type

此外,我更倾向于返回PropertyInfo而不是Type,因为它提供了更多信息,如果您只想获取属性类型,则可以使用linq轻松完成。

var types = properties.OrderBy(p => p.DeclaringType).Select(p => p.PropertyType).Distinct().ToList();

这是使用简单测试的算法

static void Main(string[] args)
{
    var properties = GetTypes(typeof(Manager));

    foreach (var propertyInfo in properties)
    {
        Console.WriteLine("{0,-20}{1,-20}{2}", 
            propertyInfo.PropertyType.Name, 
            propertyInfo.DeclaringType?.Name,
            propertyInfo.Name);
    }
}

public static List<PropertyInfo> GetTypes(Type type)
{
    if (type.Module.ScopeName == "CommonLanguageRuntimeLibrary" || // prevent getting properties of built-in type
    type == type.DeclaringType)                                    // prevent stack overflow
    {
        return new List<PropertyInfo>();
    }

    const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;

    List<PropertyInfo> result = type
        .GetProperties(flags)
        .SelectMany(p => new[] {p}.Concat(GetTypes(p.PropertyType)))
        .ToList();

    return result;
}