如何使用 var 使用 GetType() 方法创建对象?

How to use var to create an object using the GetType() method?

我厌倦了编写代码行:

SomeUIElement ui = new SomeUIElement();
Grid.Children.Clear();
Grid.Children.Add(ui);

所以我决定编写一个方法来确定元素的类型,然后清除子项并将其添加到网格中。

像这样:

    private void GridChildren(UIElement uc)
    {
        var element = uc.GetType();
        Grid.Children.Clear();
        Grid.Children.Add(element);
    }

然后我可以这样调用:

GridChilren(UserControl);

但是我一直收到错误消息:

Argument 1: cannot convert from 'System.Type' to 'System.Windows.UIElement'

关于如何确定传递给我的方法的 usercontrol 的类型有什么想法吗?

编辑:

我可以通过先创建实例然后清除并添加到网格来调用它。不过这不是我的问题。

是的,这会更方便,但出于这个问题的目的,假设我 只是 想了解如何在不写出来的情况下创建类型的实例我自己。

您正在寻找 Activator.CreateInstance() 方法,该方法将使用反射创建类型的实例。

你仍然需要施放它。

或者(取决于您如何调用它),改用泛型类型参数。

您似乎想要创建一个 UIElement 类型的实例并将其添加为网格的唯一子元素。

您代码的第一行 (var element = uc.GetType()) returns 一个 Type 类型的对象,当您尝试将其添加到网格的 [=17] 时会导致异常=] 集合(因为它希望您添加一个 UIElement 对象,而不是 Type 对象)。

你可以这样写你的方法:

private void GridChildren(UIElement uc)
{
    Grid.Children.Clear();
    Grid.Children.Add(uc);
}

然后你会这样称呼它:

SomeUIElement ui = new SomeUIElement();
GridChildren(ui);

但这仅比 "longhand" 版本节省了一行。

以下方法将创建并将新的UIElement添加到任何类型的Panel控件:

public void SetPanelChild<T>(Panel panel)
    where T : UIElement, new()
{
    T element = new T();
    panel.Children.Clear();
    panel.Children.Add(element);
}

这里使用泛型的好处是你不需要为Activator.CreateInstance()操心。您可以这样调用该方法:

SetPanelChild<TextBlock>(myPanel);

但是,当您发现自己像这样以编程方式创建控件时,可能有更好的方法来利用 WPF 必须提供的功能,例如 MVVM 模式和数据绑定。