如何使用 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 模式和数据绑定。
我厌倦了编写代码行:
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 模式和数据绑定。