0

我有一个Person继承的类,PersonBase第二个类继承EntityBase

public class Person : PersonBase
{        
   virtual public string FirstName { get; set; }
   virtual public string LastName { get; set; } 
}

public class PersonBase : EntityBase
{        
   virtual public string GroupName { get; set; }
}

public class EntityBase : IEntity
{    
   public virtual long Id { get; protected set; }
   public virtual string Error { get; protected set; }
}

我需要获取属性PersonPersonBase类的列表:

var entity = preUpdateEvent.Entity;

foreach (var item in entity.GetType().GetProperties()) //only FirstName & LastName & GroupName
{
   if (item.PropertyType == typeof(String))               
      item.SetValue(entity, "XXXXX" ,null);
} 

现在GetProperties()是包括:FirstName, LastName, GroupName, Id, Error但我只需要自己的 Person 属性,即:FirstName, LastName, GroupName

当然,我在下面的代码中使用过,但它不适合我,因为它只包含Person类的属性。

var properties = typeof(Person).GetProperties(BindingFlags.Public |
                                                  BindingFlags.Instance |
                                                  BindingFlags.DeclaredOnly);

如何获取仅在PersonPersonBase类上定义的属性?

4

4 回答 4

2

这是您的问题的通用解决方案,以扩展方法的形式:

public static PropertyInfo[] GetPropertiesUpTo<T>(this Type type, BindingFlags flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance)
{
    return type.GetProperties(flags)
               .Where(p => p.DeclaringType == typeof(T) || p.DeclaringType.IsSubclassOf(typeof(T)))
               .ToArray();
}

你可以像这样使用它:

var properties = typeof(Person).GetPropertiesUpTo<PersonBase>();
于 2012-08-18T12:40:18.883 回答
1
var properties = typeof(Person).GetProperties()
    .Where(p => p.DeclaringType == typeof(PersonBase) || p.DeclaringType == typeof(Person));
于 2012-08-18T12:36:19.730 回答
0

您将不得不通过typeof(Person).BaseTypewhich will return递归地找到它PersonBase

于 2012-08-18T12:36:09.840 回答
0

你不能告诉GetProperties()“有多少”类要从中获取属性——它要么获取当前类的属性以及它扩展/继承的所有类,要么(通过使用BindingFlags.DeclaredOnly)它可以只获取当前类的属性。

您可以使用两个调用来获取属性:

var properties = typeof(Person).GetProperties(BindingFlags.Public |
                                                  BindingFlags.Instance |
                                                  BindingFlags.DeclaredOnly);
var parentProperties = typeof(PersonBase).GetProperties(BindingFlags.Public |
                                                  BindingFlags.Instance |
                                                  BindingFlags.DeclaredOnly);

BindingFlags.DeclaredOnly或者使用每个属性的DeclaringType值过滤不使用返回的完整列表。这可以通过linqLee 所展示的方法来完成,或者通过遍历完整的属性列表并使用if-statement

List<PropertyInfo> properties = new List<PropertyInfo>();
foreach (PropertyInfo pi in typeof(Person).GetProperties(BindingFlags.Public | BindingFlags.Instance)) {
    if ((pi.DeclaringType == typeof(PersonBase)) || (pi.DeclaringType == typeof(Person))) {
        properties.Add(pi);
    }
}
于 2012-08-18T12:38:40.190 回答