有:
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
or的情况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; } }
}
}