C# 反思成本:WPF

C# 反思成本:WPF,c#,reflection,C#,Reflection,我已经实现了一个扩展助手来动态地将WPF用户控件加载到窗口。(MyButton位于另一个程序集中) 这个助手位于我所有项目中使用的类库中。这样做的目的是节省重新编码此操作的时间,并保持客户端代码更干净 我想第二双眼睛(或更多),让我知道如果这个成本太高 谢谢 public static Window OpenUserControl(this MyButton button, string controlName, string title) { //

我已经实现了一个扩展助手来动态地将WPF用户控件加载到窗口。(MyButton位于另一个程序集中)

这个助手位于我所有项目中使用的类库中。这样做的目的是节省重新编码此操作的时间,并保持客户端代码更干净

我想第二双眼睛(或更多),让我知道如果这个成本太高

谢谢

 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)
。)