有没有办法告诉运行时类属性是否来自接口?

时间:2016-08-31 22:40:14

标签: c#

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 ?

1 个答案:

答案 0 :(得分:4)

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

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

结果interfacePropertiesIEnumerable<string>。在这种情况下,它将包含:

LocX
LocY

您可以在列表中查看所需的属性。

IMO,这是查询您的课程以获取此信息的一种昂贵方式。也许有更多关于为什么的背景知识,你可以做出更好的选择。