Существует:
if (myControl is MyControl)
{
var m = (MyControl)myControl;
}
Это будет работать в любой части иерархии типов.Следующая проверка не будет работать, если сама переменная имеет базовый тип:
MyBaseControl myControl = null;
if (myControl.GetType() == typeof(MyControl))
{
}
Однако похоже, что вам нужно поведение переопределенных методов или свойств.В обычной ситуации вы должны переопределить Visible
:
public override bool Visible
{
get { return true; } // Always visible in derived class.
}
Однако это только в том случае, если базовый класс не запечатан и элемент, который вы хотите переопределить, имеет значение abstract
или virtual
.Если это не так, то я бы придерживался приведения к производному типу ... не идеально, но не так много вариантов.
Звучит так, будто вы пытались скрыть базовый элемент следующим образом:
public new bool Visible
{
get { return true; }
}
Это работает, только если у вас есть ссылка на сам тип.Если у вас есть ссылка на базовый тип, скрытие элемента работает , а не , оно не знает, что элемент скрыт в производном типе:
MyBaseControl c = new MyDerivedControl();
bool vis = c.Visible; // Comes from MyBaseControl even if hidden in derived control.
(в приведенном выше, если Visible
было переопределено, то оно будет получено из производного класса).
Обновление: Чтобы сделать все это во время выполнения, вы можете делать следующее, пока вы знаетеназвания вещей, которые вы хотите отразить:
class Program
{
static void Main(string[] args)
{
A a = new B();
// Get the casted object.
string fullName = a.GetType().FullName;
object castedObject = Convert.ChangeType(a, Type.GetType(fullName));
// Use reflection to get the type.
var pi = castedObject.GetType().GetProperty("Visible");
Console.WriteLine(a.Visible);
Console.WriteLine((bool)pi.GetValue(castedObject, null));
Console.Read();
}
}
class A
{
public bool Visible { get { return false; } }
}
class B : A
{
public new bool Visible { get { return true; } }
}
}