【问题标题】:How to use var to create an object using the GetType() method?如何使用 var 使用 GetType() 方法创建对象?
【发布时间】:2015-03-29 05:33:26
【问题描述】:

我已经厌倦了编写代码行:

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 的类型有什么想法吗?

编辑:

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

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

【问题讨论】:

  • 你需要传递一个实例(ui)而不是类型
  • 该死,我以为可能是这样。我只是想真的很懒,只通过类型!男人……
  • 这有什么帮助?您总是可以使用Activator.CreateInstance 来制作一个新的,但这并不能为您带来太多收益...
  • 你为什么使用GetType?您没有找到相同类型的控件,您只是在清除控件并将其添加到 Grid 控件。
  • I'm fed up of writing the lines of code - 然后通过使用 XAML 和 DataBinding 来学习正确使用 WPF。

标签: c# wpf user-controls gettype


【解决方案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 模式和数据绑定。

【讨论】:

    【解决方案2】:

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

    你仍然需要投射它。

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

    【讨论】:

    • 我在看到其中一个 cmets 后对此进行了调查。可以举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2017-09-26
    相关资源
    最近更新 更多