0

継承するPersonクラスがPersonBaseあり、この2番目のクラスが継承し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()は include です:FirstName, LastName, GroupName, Id, Errorしかし、私は自分の Person プロパティのみが必要です:FirstName, LastName, GroupName

もちろん、以下のコードで使用されていますが、Personクラスのプロパティのみが含まれているため、私には適していません。

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

クラスでのみ定義さPersonれているプロパティを取得するにはどうすればよいですか?PersonBase

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).BaseTypeありますPersonBase

于 2012-08-18T12:36:09.840 に答える
0

プロパティを取得する「いくつ」のクラスを指定することはできませんGetProperties()。現在のクラスとその拡張/継承元のすべてのクラスのプロパティを取得するか、または (を使用してBindingFlags.DeclaredOnly) 現在のクラスのプロパティのみを取得できます。

プロパティを取得するには、次の 2 つの呼び出しを使用できます。

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値を使用して、 を使用せずに返された完全なリストをフィルタリングします。これはlinq、Leeが示したように、またはプロパティの完全なリストをループして次を使用することで実行でき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 に答える