Короче говоря, у меня есть функция С#, которая выполняет задачу по заданному типу, который передается как экземпляр объекта. Все работает отлично, когда экземпляр класса передается. Однако, когда объект объявлен как интерфейс, мне бы очень хотелось найти конкретный класс и выполнить действие над этим типом класса.
Вот вездесущий плохой пример (блистательный с неправильным корпусом свойств и т.д.):
public interface IA
{
int a { get; set; }
}
public class B : IA
{
public int a { get; set; }
public int b { get; set; }
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
}
// snip
IA myBObject = new B();
PerformAction(myBObject);
IA myCObject = new C();
PerformAction(myCObject);
// snip
void PerformAction(object myObject)
{
Type objectType = myObject.GetType(); // Here is where I get typeof(IA)
if ( objectType.IsInterface )
{
// I want to determine the actual Concrete Type, i.e. either B or C
// objectType = DetermineConcreteType(objectType);
}
// snip - other actions on objectType
}
Я хотел бы, чтобы код в PerformAction использовал параметр Reflection to it и видел, что это не просто экземпляр IA, а экземпляр B, а также свойство b с помощью GetProperties(). Если я использую .GetType(), я получаю тип IA - не то, что я хочу.
Как может PerformAction определить базовый тип конкретного экземпляра IA?
У некоторых может возникнуть соблазн предложить использовать абстрактный класс, но это лишь ограничение моего плохого примера. Эта переменная будет первоначально объявлена как экземпляр интерфейса.