2009-12-04 3 views
1

У меня есть экземпляры классов A и B, и оба класса реализуют элемент «Текст». Есть ли способ доступа к элементу Text в общем виде? Я надеюсь на то, аналогичное тот, яваскрипт способ просто сказать:Доступ к идентично названным членам класса экземпляров разных классов

instance['Text'] = value; 

Примечания: эти два класса, к сожалению, не так реализовать один и тот же интерфейс с элементом текста.

ответ

2

В отличие от javascript, C# является статическим языком, и если оба класса не реализуют общий интерфейс или базовый класс, вы можете использовать отражение для достижения той же цели.

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

Отлично! Именно то, что я искал. –

1

Если вы не можете сделать и B реализовать тот же интерфейс, то вам нужно использовать reflection, чтобы получить доступ к любому члену класса по имени, что-то вроде этого:

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

где theInstance будет экземпляр класса A.

+0

Спасибо, что назвали технику! У тебя почти был лучший ответ. ;) –

0

В идеале вы должны иметь один класс с элементом «Текст», который будет базовым для A и B. Вероятно, это не удобно, но оно более надежно и правильно. Старайтесь не использовать отражение, где вы можете сделать то же самое другим способом.

0

Если вы можете сделать и 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();