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

时间:2015-11-17 08:30:46

标签: c# reflection

我有一个基类CrmObject和一些继承它的类(Aufgabe,Kontakt,...)。我只有子类的字符串值,我想在一个Statement中同时获取CrmObject的属性和特定的子类。

我会得到这样的子类的属性:

var propertyInfos = typeof(CrmObject).Assembly.GetType("Aufgabe").GetProperties().Where(p => Attribute.IsDefined(p, typeof(ImportParameter)));

但我也想获得CrmObject的属性。可能在同一声明中。

[UPDATE] 这应该是它。我稍后会测试一下。感谢你们。 :)

var propertyInfos = typeof(CrmObject).Assembly.GetType("DAKCrmImport.Core." +crmType).G‌​etProperties().Where(p => Attribute.IsDefined(p, typeof(ImportParameter)));

奇怪的是,您不需要使用bindingflag参数来展平层次结构。显然它是默认值?好吧..无论如何。它有效:)

2 个答案:

答案 0 :(得分:1)

对我来说很好。

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();
    }
}

答案 1 :(得分:1)

正如马克所说,你需要指定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)));

您可以在great SO answerType.GetProperties的文档中详细了解相关内容。