44
задан 21 July 2009 в 15:21
поделиться
Type objectType = myObject.GetType();
Все равно должно дать вам конкретный тип, по вашему примеру.
То, что вы делаете, на самом деле является дизайном кровати, но вам не нужно использовать отражение, вы можете проверить это так
void PerformAction(object myObject)
{
B objectType = myObject as B; // Here is where I get typeof(IA)
if ( objectType != null )
{
//use objectType.b
}
else
{
//Same with A
}
// snip - other actions on objectType
}
У вас никогда не может быть экземпляров интерфейса. Поэтому определить, имеете ли вы дело с интерфейсом или конкретным типом, невозможно, поскольку вы всегда будете иметь дело с конкретным типом. Так что я не уверен, что ваш вопрос имеет смысл. Что именно вы пытаетесь сделать и почему?
Не могу не согласиться насчет плохого дизайна. Если у вас есть интерфейс, это должно быть связано с тем, что вам нужно использовать некоторые общие функции, не заботясь о конкретной реализации. Учитывая ваш пример, похоже, что метод PerformAction действительно должен быть частью интерфейса:
public interface IA
{
int a { get; set; }
void PerformAction();
}
public class B: IA
{
public int a { get; set; }
public int b { get; set; }
public void PerformAction()
{
// perform action specific to B
}
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
public void PerformAction()
{
// perform action specific to C
}
}
void PerformActionOn(IA instance)
{
if (instance == null) throw new ArgumentNullException("instance");
instance.PerformAction();
// Do some other common work...
}
B b = new B();
C c = new C();
PerformActionOn(b);
PerformActionOn(c);
Может быть, вы ищете оператор
void PerformAction(object myObject)
{
if (myObject is B)
{
B myBObject = myObject as B;
myBObject.b = 1;
}
if (myObject is C)
{
C myCObject = myObject as C;
myCObject.c = 1;
}
// snip - other actions on objectType
}