gpt4 book ai didi

c# - GetProperties() 返回接口(interface)继承层次结构的所有属性

转载 作者:IT王子 更新时间:2023-10-29 03:37:41 26 4
gpt4 key购买 nike

假设以下假设的继承层次结构:

public interface IA
{
int ID { get; set; }
}

public interface IB : IA
{
string Name { get; set; }
}

使用反射并进行以下调用:

typeof(IB).GetProperties(BindingFlags.Public | BindingFlags.Instance) 

只会产生接口(interface) IB 的属性,即“Name”。

如果我们对下面的代码做类似的测试,

public abstract class A
{
public int ID { get; set; }
}

public class B : A
{
public string Name { get; set; }
}

调用 typeof(B).GetProperties(BindingFlags.Public | BindingFlags.Instance) 将返回 PropertyInfo 对象数组,用于“ID”和“姓名”。

是否有一种简单的方法可以像第一个示例那样在接口(interface)的继承层次结构中找到所有属性?

最佳答案

我已经将@Marc Gravel 的示例代码调整为一个有用的扩展方法,它封装了类和接口(interface)。它还首先添加了接口(interface)属性,我认为这是预期的行为。

public static PropertyInfo[] GetPublicProperties(this Type type)
{
if (type.IsInterface)
{
var propertyInfos = new List<PropertyInfo>();

var considered = new List<Type>();
var queue = new Queue<Type>();
considered.Add(type);
queue.Enqueue(type);
while (queue.Count > 0)
{
var subType = queue.Dequeue();
foreach (var subInterface in subType.GetInterfaces())
{
if (considered.Contains(subInterface)) continue;

considered.Add(subInterface);
queue.Enqueue(subInterface);
}

var typeProperties = subType.GetProperties(
BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.Instance);

var newPropertyInfos = typeProperties
.Where(x => !propertyInfos.Contains(x));

propertyInfos.InsertRange(0, newPropertyInfos);
}

return propertyInfos.ToArray();
}

return type.GetProperties(BindingFlags.FlattenHierarchy
| BindingFlags.Public | BindingFlags.Instance);
}

关于c# - GetProperties() 返回接口(interface)继承层次结构的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/358835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com