Существует:
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
были отменены, то это будет происходить из производного класса).
Update: делать все это во время выполнения, вы можете сделать следующее так долго, как вы знаете имена вещей, которые вы хотите, чтобы отразить:
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; } }
}
}
Я считаю, что вы поменялись смыслом и приведения к базовому типу понижающего приведения. Upcasting - это когда вы конвертируете из производного класса в базовый класс ** вверх ** иерархию наследования (например,'MyControl'' Control'). Downcasting - это противоположный путь, в котором вы бросаете ** вниз ** иерархию наследования. В C# upcasting неявно и что-то, что вам не нужно записывать в коде. –