我正在寻找一种获取向上转换对象的可能类型的方法。 例如:我有一个继承Control的MyControl类型的控件。现在,当MyControl类型的对象被下载到Control时,有一种方法可以找到它,如果它是顶级对象类型,或者现在可以获得可以对其进行上传的类型(在本例中为MyControl) ? 我希望它上传到MyControl(使用Reflection)并获得带反射的Property。但我不知道MyControl在我必须这样做的地方。
MyControl实现了可见的新功能。现在,当我调用control.Visible = true时,它将调用Visible of Control,但我必须调用MyControl的Visible。
感谢您的帮助。
答案 0 :(得分:4)
您也可以使用:
MyControl myControl = someControlOfTypeMyControl as MyControl
if(myControl != null)
{
//your stuff
}
使用“as”.net框架检查控件是否来自该类型,如果可以转换,.NET Framework将转换为MyControl类型,否则返回null。
所以基本上,它和以前的答案一样,但更干净(imho,你可以认为不同)
答案 1 :(得分:2)
有:
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; } }
}
}
答案 2 :(得分:0)
Control control = (control)someControlOfTypeMyControl;
if (control is MyControl) {
var myControl = (MyControl)control;
var propertyValue = myControl.SomeProperty;
}