我有一个基类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).GetProperties().Where(p => Attribute.IsDefined(p, typeof(ImportParameter)));
奇怪的是,您不需要使用bindingflag参数来展平层次结构。显然它是默认值?好吧..无论如何。它有效:)
答案 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).GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public).Where(p => Attribute.IsDefined(p, typeof(ImportParameter)));
您可以在great SO answer和Type.GetProperties的文档中详细了解相关内容。