gpt4 book ai didi

c# - 通过反射排除接口(interface)实现成员

转载 作者:太空狗 更新时间:2023-10-30 01:01:24 26 4
gpt4 key购买 nike

我有以下接口(interface)和实现:

public interface INew
{
string TestString { get; }
}

public class PurchaseOrder : INew
{
public string OrderNo { get; set; }

public string TestString
{
get { return "This is a test string"; }
}
}

我试图反射(reflect)出 PurchaseOrder 对象的 OrderNo 部分,使用以下代码:

var props = p.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.FlattenHierarchy);
foreach (var prop in props)
{
Console.WriteLine(prop.Name);
}

我的输出也返回 TestString 属性。我已经搜索了排除已实现接口(interface)成员的方法,但只能找到包含它的项目。谁能告诉我如何排除这些项目?

最佳答案

这是一个使用 GetInterfaceMap 方法的解决方案:

var interfaceMethods = typeof(PurchaseOrder)
.GetInterfaces()
.Select(x => typeof(PurchaseOrder).GetInterfaceMap(x))
.SelectMany(x => x.TargetMethods).ToArray();

var propsNotFromInterface= typeof(PurchaseOrder)
.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.FlattenHierarchy)
.Where(x => !x.GetAccessors(true).Any(y => interfaceMethods.Contains(y))).ToArray();

Console.WriteLine(propsNotFromInterface.Length);

您可以非常轻松地将其重构为通用方法。

关于c# - 通过反射排除接口(interface)实现成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39243940/

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