是否有一种在运行时告诉类属性是否来自接口的方法

本文关键字:是否 属性 方法 接口 运行时 一种 | 更新日期: 2023-09-27 18:04:56

public class Bus : IPresentable
{
    public string Name { get; set; } = "Bus";
    public int ID { get; set; } = 12345;
    //******** IPresentable interface ***************//
    public int LocX { get; set; }
    public int LocY { get; set; }
}

接口:

public interface IPresentable
{
    int LocX { get; set; }
    int LocY { get; set; }
}

在我的应用程序:

Bus bus = new Bus();
bus.LocX = 10; // is there a way to tell that this comes from interface
bus.Name = "New Name" ; // but this is not ?

是否有一种在运行时告诉类属性是否来自接口的方法

使用反射,我们可以询问Bus类并检索"属于"类和它可能实现的所有接口的属性名称列表:

var interfaceProperties = typeof(Bus)
    .GetProperties().Select(p => p.Name)
    .Intersect(typeof(Bus)
        .GetInterfaces()
        .SelectMany(i => i.GetProperties())
        .Select(p => p.Name))

结果interfaceProperties是一个IEnumerable<string>。在本例中,它将包含:

LocX
LocY

你可以在列表中查看你想要的属性。

依我看,这是一种昂贵的方式来询问您的类以获取此信息。也许有了更多关于为什么要这样做的背景知识,可以产生一个更好的替代