Доступ к членам класса с одинаковыми именами экземпляров разных классов
Вопрос
У меня есть экземпляры классов A и B, и оба класса реализуют элемент 'Text'.Есть ли способ получить доступ к тексту участника общим способом?Я надеюсь на что-то аналогичное способу javascript просто сказать:
instance['Text'] = value;
Примечание:к сожалению, эти два класса не оба реализуют один и тот же интерфейс с текстовым элементом.
Решение
В отличие от javascript, C # является статическим языком, и если оба класса не реализуют общий интерфейс или базовый класс, вы могли бы использовать отражение для достижения той же цели.
instance.GetType().GetProperty("Text").SetValue(instance, "new value", null);
Другие советы
Если вы не можете заставить A и B реализовать один и тот же интерфейс, то вам нужно использовать отражение чтобы получить доступ к любому члену класса по имени, что-то вроде этого:
typeof(A).GetProperty("Text").GetValue(theInstance, null);
где theInstance
был бы экземпляром класса 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();