动态地将对象投射回原来的状态

时间:2018-06-25 22:45:03

标签: c# reflection types casting

我想将项目添加到Dockpanel。我收到了作为对象的项目(例如图像,按钮等)。

如何将对象投射回原来的位置并添加到Dockpanel中?

我尝试过这样的事情

    import vpython as vs
    vs.ModelLearning(features, prices)

1 个答案:

答案 0 :(得分:2)

问题

您的代码的问题在于您不能简单地将object添加到DockPanel.Children,因为它是UIElementCollection,这意味着您只能添加{{3} } s


解决方案

因此,而不是

Dockpanel.Children.Add((T) Convert.ChangeType(obj, typeof(T)));

(不会编译),您需要将要添加的对象投射到UIElement 上,像这样:

DockPanel.Children.Add((UIElement) obj);

您需要注意的是,obj实际上是UIElement,例如ButtonImageTextBox等,或强制转换到UIElement的操作将失败。


建议

使用辅助方法或类似的UIElement

public static void AddChild(this DockPanel dockPanel, T childToAdd) where T : UIElement
{
    dockPanel.Children.Add(childToAdd);
}

具有易于使用仅允许有效输入的优点,这要归功于通用约束where T : UIElement,这意味着“要添加的内容必须来自UIElement

然后您可以像这样调用方法:

this.MyDockPanel.AddChild(new Image());
this.MyDockPanel.AddChild(new Button());

编辑-实际需求

OP已经阐明了他们的实际要求,即

  

我在对象数组中得到一个图像-我想将其投射回图像-然后我想将其添加到Dockpanel-相同的代码也可以与Buttons一起使用

这意味着我们要添加其中包含的所有项目

object[] myItems = ...

访问我们名为DockPanel的{​​{1}}。

让我们利用上面的扩展方法,现在我们可以这样做:

myDockPanel

,瞧,我们已经完成了-无需强制转换为object[] myItems = ...; foreach(object obj in myItems) { this.myDockPanel.AddChild(obj as UIElement); } ,我们只需出于上述原因将其强制转换为Image,并且该代码适用于UIElement等。也是