获取基类和特定继承类的属性



我有一个基类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).G‌​etProperties().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所说,您需要指定BindingFlags.FlattenHierarchy
但是,当您指定BindingFlags时,您需要准确地指定您想要的内容。这意味着您还必须指定BindingFlags.Instance以获得实例成员,并指定BindingFlags.Public以包括公共成员

所以命令看起来是这样的:

var propertyInfos = typeof(CrmObject).Assembly.GetType(crmType).G‌​etProperties(BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public).Where(p => Attribute.IsDefined(p, typeof(ImportParameter)));

您可以在这个伟大的SO答案和Type.GetProperties.的文档中阅读更多关于它的信息

相关内容

  • 没有找到相关文章