【问题标题】:Access identically named class members of instances of different classes访问不同类实例的同名类成员
【发布时间】:2024-04-26 15:00:01
【问题描述】:

我有 A 类和 B 类的实例,两个类都实现了一个成员“文本”。有没有办法以通用方式访问成员文本? 我希望有类似于 javascript 方式的简单说:

instance['Text'] = value;

注意:很遗憾,这两个类并不都使用 Text 成员实现相同的接口。

【问题讨论】:

    标签: c# class members


    【解决方案1】:

    与 javascript 不同,C# 是一种静态语言,如果两个类都没有实现公共接口或基类,您可以使用反射来实现相同的目标。

    instance.GetType().GetProperty("Text").SetValue(instance, "new value", null);
    

    【讨论】:

    • 太棒了!正是我想要的。
    【解决方案2】:

    如果你不能让 A 和 B 实现相同的接口,那么你需要使用reflection 来通过名称访问任何类成员,如下所示:

    typeof(A).GetProperty("Text").GetValue(theInstance, null);
    

    theInstance 是 A 类的一个实例。

    【讨论】:

    • 感谢您命名该技术!你几乎得到了最佳答案。 ;)
    【解决方案3】:

    理想情况下,您应该拥有一个包含成员“Text”的类,该成员将作为 A 和 B 的基础。这可能不方便,但它更可靠和正确。 尽量不要在可以通过其他方式做同样事情的地方使用反射。

    【讨论】:

      【解决方案4】:

      如果你能让A和B实现相同的接口

       interface ISomeGenericNameForAAndB
      {
          string Text { get; }
      }
      class A :ISomeGenericNameForAAndB
      {
          public string Text { get { return "some Text from A"; } }    
      }
      class B : ISomeGenericNameForAAndB
      {
          public string Text { get { return "some Text from B"; } }
      }
      
      ISomeGenericNameForAAndB anAInstance = new A();
      ISomeGenericNameForAAndB aBInstance = new B();
      

      【讨论】:

        最近更新 更多