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

时间:2015-01-29 20:33:55

标签: c# wpf user-controls gettype

我厌倦了编写代码行:

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类型的任何想法?

修改

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

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

2 个答案:

答案 0 :(得分:1)

好像你想创建一个UIElement类型的实例,并将其添加为网格的唯一子元素。

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

你可以这样编写你的方法:

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

然后你会这样称呼它:

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

但这只会比“长手”版本节省一行。

以下方法将创建并向任何类型的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模式和数据绑定。

答案 1 :(得分:0)

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

你仍然需要施展它。

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