请参阅此代码
@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;人)
我希望递归地找到所有使用的特定类型的类型。
答案 0 :(得分:0)
你的问题有点棘手。因为您只想获取不是以.Net库类型构建的类型的属性。例如Dictionary
,String
,DateTime
,Array
等,您有自己想要排除的属性。幸运的是,有很多方法可以知道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;
}