我有 A 类和 B 类的实例,两个类都实现了一个成员“文本”。有没有办法以通用方式访问成员文本?我希望类似于 javascript 的方式简单地说:
instance['Text'] = value;
注意:不幸的是,这两个类并不都使用 Text 成员实现相同的接口。
与 javascript 不同,C# 是一种静态语言,如果两个类都没有实现公共接口或基类,您可以使用反射来实现相同的目标。
instance.GetType().GetProperty("Text").SetValue(instance, "new value", null);
如果不能让 A 和 B 实现相同的接口,则需要使用反射来按名称访问任何类成员,如下所示:
typeof(A).GetProperty("Text").GetValue(theInstance, null);
wheretheInstance
将是 A 类的一个实例。
理想情况下,您应该有一个包含成员“Text”的类,这将是 A 和 B 的基础。可能它不方便,但它更可靠和正确。尽量不要在可以以其他方式做同样事情的地方使用反射。
如果可以让 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();