Вы можете перегрузить Foo
, чтобы получить либо A
, либо B
:
void Foo(A t)
{
int x = t.X;
}
void Foo(B t)
{
int x = t.X;
}
Если вы хотите сделать это для каждого мыслимого класса, который может иметь свойство X
, тогда вы ' Вам понадобится решение на основе отражения. Например:
void Foo(object obj)
{
var property = obj.GetType().GetProperty("X");
if(property == null) throw new Exception();
int x = (int)property.GetValue(obj);
}
ПРИМЕЧАНИЕ. Я минимизировал обработку ошибок здесь. Вам нужно будет обработать случай, когда свойство может не иметь геттера (редко) или когда оно не возвращает int
Если количество классов является управляемым, то вы можете создать интерфейс с свойство, получить новый класс и реализовать интерфейс, который не потребует изменения. Например:
interface IMyStuff
{
int X{get;}
}
class MyA : A, IMyStuff
{
}
class MyB : B, IMyStuff
{
}
Foo не может принять интерфейс:
void Foo(IMyStuff stuff)
{
int x = stuff.X
}