Короче говоря, у меня есть функция C #, которая выполняет задачу с данным типом, который передается как экземпляр объекта. Все работает нормально, когда передается экземпляр класса. Однако, когда объект объявлен как интерфейс, я действительно хотел бы найти конкретный класс и выполнить действие над этим типом класса.
Вот вездесущий плохой пример (великолепный с неправильным регистром свойств и т. Д.):
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 против своего параметра и увидел, что это не просто экземпляр IA, но что это экземпляр B, и чтобы видеть свойство "b" через GetProperties (). Если я использую .GetType (), я получаю тип IA - не то, что я хочу.
Как PerformAction может определить базовый конкретный тип экземпляра IA?
У некоторых может возникнуть соблазн предложить использовать класс Abstract, но это только ограничение моего плохого примера. Переменная будет первоначально объявлена как экземпляр интерфейса.