Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据此条件获取继承类的属性_C#_.net_Reflection_Bindingflags - Fatal编程技术网

C# 如何根据此条件获取继承类的属性

C# 如何根据此条件获取继承类的属性,c#,.net,reflection,bindingflags,C#,.net,Reflection,Bindingflags,我有一个Person类继承了PersonBase,第二个类继承了EntityBase: public class Person : PersonBase { virtual public string FirstName { get; set; } virtual public string LastName { get; set; } } 及 及 我需要获取Person和PersonBase类的属性列表: var entity = preUpdateEvent.

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

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

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

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

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

您必须通过
typeof(Person)递归查找它。BaseType
将返回
PersonBase
您必须通过
typeof(Person)递归查找它.BaseType
将返回
PersonBase

您无法判断
GetProperties()
“有多少”类可从中获取属性-它可以获取当前类及其扩展/继承的所有类的属性,也可以(通过使用)仅获取当前类的属性

var properties = typeof(Person).GetProperties()
    .Where(p => p.DeclaringType == typeof(PersonBase) || p.DeclaringType == typeof(Person));
您可以使用两个调用来获取属性:

var properties = typeof(Person).GetProperties(BindingFlags.Public |
                                                  BindingFlags.Instance |
                                                  BindingFlags.DeclaredOnly);
var parentProperties = typeof(PersonBase).GetProperties(BindingFlags.Public |
                                                  BindingFlags.Instance |
                                                  BindingFlags.DeclaredOnly);
或对返回的完整列表进行筛选,但不使用BindingFlags。仅使用每个属性的值声明。如Lee所示,这可以通过
linq
完成,也可以通过遍历完整的属性列表并使用
if语句来完成:

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);
    }
}
列表属性=新列表();
foreach(PropertyInfo pi的typeof(Person).GetProperties(BindingFlags.Public | BindingFlags.Instance)){
if((pi.DeclaringType==typeof(PersonBase))| |(pi.DeclaringType==typeof(Person))){
属性。添加(pi);
}
}

您不能告诉
GetProperties()
要从多少个类获取属性-它要么获取当前类及其扩展/继承的所有类的属性,要么(通过使用)仅获取当前类的属性

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

var properties = typeof(Person).GetProperties(BindingFlags.Public |
                                                  BindingFlags.Instance |
                                                  BindingFlags.DeclaredOnly);
var parentProperties = typeof(PersonBase).GetProperties(BindingFlags.Public |
                                                  BindingFlags.Instance |
                                                  BindingFlags.DeclaredOnly);
或对返回的完整列表进行筛选,但不使用BindingFlags。仅使用每个属性的值声明。如Lee所示,这可以通过
linq
完成,也可以通过遍历完整的属性列表并使用
if语句来完成:

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);
    }
}
列表属性=新列表();
foreach(PropertyInfo pi的typeof(Person).GetProperties(BindingFlags.Public | BindingFlags.Instance)){
if((pi.DeclaringType==typeof(PersonBase))| |(pi.DeclaringType==typeof(Person))){
属性。添加(pi);
}
}

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

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();
}
public static PropertyInfo[]GetPropertiesUpTo(此类型,BindingFlags flags=BindingFlags.public | BindingFlags.static | BindingFlags.Instance)
{
返回类型.GetProperties(标志)
其中(p=>p.DeclaringType==typeof(T)| | p.DeclaringType.IsSubclassOf(typeof(T)))
.ToArray();
}
您可以这样使用它:

var properties = typeof(Person).GetPropertiesUpTo<PersonBase>();
var properties=typeof(Person).GetPropertiesUpTo();

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

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();
}
public static PropertyInfo[]GetPropertiesUpTo(此类型,BindingFlags flags=BindingFlags.public | BindingFlags.static | BindingFlags.Instance)
{
返回类型.GetProperties(标志)
其中(p=>p.DeclaringType==typeof(T)| | p.DeclaringType.IsSubclassOf(typeof(T)))
.ToArray();
}
您可以这样使用它:

var properties = typeof(Person).GetPropertiesUpTo<PersonBase>();
var properties=typeof(Person).GetPropertiesUpTo();