我有一个基类CrmObject和几个继承它的类(Aufgabe,Kontakt,…)。我只有一个子类的字符串值,我想在一个语句中获得CrmObject的属性和特定的子类。
我会得到这样的子类的属性:
var propertyInfos = typeof(CrmObject).Assembly.GetType("Aufgabe").GetProperties().Where(p => Attribute.IsDefined(p, typeof(ImportParameter)));
但是我也想得到CrmObject的性质。可能在同一声明中。
[更新]应该就是这样。我稍后再测试。谢谢大家。:)
var propertyInfos = typeof(CrmObject).Assembly.GetType("DAKCrmImport.Core." +crmType).GetProperties().Where(p => Attribute.IsDefined(p, typeof(ImportParameter)));
奇怪的是,您不需要bindingflag参数来压平层次结构。显然这是默认值?好无论什么它的工作原理是:)
对我来说很好。
public class CrmObject
{
[ImportParameter]
public string Name { get; set; }
}
public class Aufgabe : CrmObject
{
[ImportParameter]
public int Id { get; set; }
}
public class ImportParameterAttribute : Attribute
{
}
public class InheritenceProgram
{
public static void Main()
{
var propertyInfos = typeof(CrmObject).Assembly.GetType("Aufgabe").GetProperties().Where(p => Attribute.IsDefined(p, typeof(ImportParameterAttribute)));
var list = propertyInfos.ToList();
}
}
正如Mark所说,您需要指定 所以命令看起来是这样的: 您可以在这个伟大的SO答案和Type.GetProperties.的文档中阅读更多关于它的信息BindingFlags.FlattenHierarchy
但是,当您指定BindingFlags
时,您需要准确地指定您想要的内容。这意味着您还必须指定BindingFlags.Instance
以获得实例成员,并指定BindingFlags.Public
以包括公共成员var propertyInfos = typeof(CrmObject).Assembly.GetType(crmType).GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public).Where(p => Attribute.IsDefined(p, typeof(ImportParameter)));