C# 反思成本:WPF
我已经实现了一个扩展助手来动态地将WPF用户控件加载到窗口。(MyButton位于另一个程序集中) 这个助手位于我所有项目中使用的类库中。这样做的目的是节省重新编码此操作的时间,并保持客户端代码更干净 我想第二双眼睛(或更多),让我知道如果这个成本太高 谢谢C# 反思成本:WPF,c#,reflection,C#,Reflection,我已经实现了一个扩展助手来动态地将WPF用户控件加载到窗口。(MyButton位于另一个程序集中) 这个助手位于我所有项目中使用的类库中。这样做的目的是节省重新编码此操作的时间,并保持客户端代码更干净 我想第二双眼睛(或更多),让我知道如果这个成本太高 谢谢 public static Window OpenUserControl(this MyButton button, string controlName, string title) { //
public static Window OpenUserControl(this MyButton button, string controlName, string title)
{
//
object uControl;
try
{
Type newType = button.GetType().Assembly.GetType(controlName,true,true);
uControl = Activator.CreateInstance(newType);
}
catch (Exception e)
{
throw;
}
// launch the usercontrol as a window.
Window form = new Window
{
Title = title,
Content = uControl,
ShowInTaskbar = false
};
return form;
}
如果您在编译时知道类型,那么最好使用以下泛型:
// Possibly add more generic constraints to T?
public static Window OpenUserControl<T>(string title)
where T : new()
{
return new Window
{
Title = title,
Content = new T(),
ShowInTaskbar = false
};
}
//是否可能向T添加更多通用约束?
公共静态窗口OpenUserControl(字符串标题)
其中T:new()
{
返回新窗口
{
头衔,
Content=newt(),
ShowInTaskbar=false
};
}
这可能比通过反射查找类型快一点,尽管另一种选择是缓存委托以调用无参数构造函数—工作量更多,但根据我的经验,速度要快得多。您可以通过嵌套泛型类来实现这一点,将类中的Func
或Func
缓存为静态字段
只有您才能真正知道这是否足够快,但基准测试应该足够容易,我非常怀疑这是否会成为瓶颈。您必须按名称传递控件类型吗?你为什么不把它当作
类型
,甚至把它当作泛型?不过,你绝对不应该有那个try/catch块——这只是一个粗糙的话题。这似乎是一个很好的话题,因为我无法想象你会打开这么多的窗口,这会有什么影响。正如上面所建议的,您可能可以对其进行改进,但反射方面并不重要。@austinwernli谢谢,我下次会这样做。@JonSkeet不,我可以肯定地传入类型。我传入了“button”,因为OpenUsercontrol位于不同的程序集中。我需要一个引用来找到我想要的“usercontrol”。谢谢您的更改。@Arnej65:啊,我明白了-所以当您通过泛型传递类型本身时,不需要这样做。将编辑。(虽然即使在原始代码中,除非您实际上要传递与MyButton
位于不同程序集中的MyButton
的子类型,否则为了简单起见,您也可以使用typeof(MyButton)
。)