如何通过 C# 中的接口访问对象的 属性

How to access an object's property through its interface in C#

我有一个 class A 和一个 属性 A.A 和一个 class B 和一个 属性 B.B。两者都实现了 I2C 接口,该接口强制执行 IC.C 属性,但不执行 A.A 或 B.B。

我想要一个接收 A 或 B 的实例作为参数并可以访问这些属性的方法,例如:

void MyMethod(IC obj)
{
    if (obj.GetType().Name.Equals("A"))
    {
        var v = obj.A;    // some code for access the property
    }
}

这可能吗?而且,这是个好主意吗? 谢谢!

已编辑:按照@dmedine 的建议将接口重命名为 IC。

最佳方法取决于您要执行的操作的具体细节,但这里有 2 个选项:

模式匹配

void MyMethod(C obj)
{
    if (obj is A objAsA)
    {
        var vA = objAsA.A;
    }

    if (obj is B objAsB)
    {
        var vB = objAsB.B;
    }
}

反思

void MyMethod(C obj)
{
    var objType = obj.GetType();
    if (objType.Name.Equals("A"))
    {
        var prop = objType.GetProperty("A");
        var v = prop.GetValue(obj, null);
    }
}

在我看来,这样做在某些情况下很有用。例如,如果你有一堆继承自接口 IC 的对象(接口的名称总是以 I 开头),它们具有相似但又独特的 properties/methods(迫不及待地等待评论)滚进来)。您可以测试使用 is 继承的 class 的类型。例如,假设 AB 实现 IC:

void MyMethod(List<IC> objects)
{
    foreach(IC object in objects) 
    {
        var cProperty = object.CProperty;  // use common property
        if(object is A a)
            var aProperty = a.AProperty;  // if A, use unique property
    }
}

void Foo()
{
    List<IC> cObjects = new();
    cObjects.Add(new A());
    cObjects.Add(new B());
    MyMethod(cObjects);
}