2015-06-04 25 views
-1

我已經實現了一個擴展幫助器來動態地將WPF usercontrol加載到窗口。 (MyButton在另一個程序集中)。反射成本:WPF

該幫助程序位於我的所有項目中使用的類庫中。這個想法是爲了節省重新編碼這個操作,並保持客戶端代碼更清潔。

我想第二雙眼睛(或更多)讓我知道,如果這個成本太高。

謝謝。

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; 
     } 
+3

你*有*是否按名稱傳遞控件類型?任何理由你不只是接受它作爲'Type',或者甚至使它通用?你絕對不應該有這個嘗試/抓塊 - 這只是一個蹩腳的問題。 –

+2

似乎是一個很好的主題http://codereview.stackexchange.com/ –

+2

我無法想象,你打開這麼多窗口,這將是至關重要的。如上所述,您可能可以改進它,但反射方面不是問題。 – Jay

回答

0

如果你知道在編譯時的類型,你會好很多關使這個通用:

// 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 
    }; 
} 

這很可能是一個比找到的類型更快通過反思,雖然另一種選擇是緩存委託來調用無參數的構造函數 - 更多的工作,但在我的經驗中更快。你可以通過一個嵌套泛型類來實現,在類中緩存Func<T>Func<object>作爲靜態字段。

只有你真的可以判斷這是否足夠快 - 但它應該很容易進行基準測試,而且我非常懷疑這將是一個瓶頸。

+0

由於OpenUsercontrol在不同的程序集中,因此我傳入'按鈕'。我需要一個參考來找到我想要的'usercontrol'。感謝您的更改。 – Arnej65

+1

@ Arnej65:啊,我明白了 - 所以當你通過泛型傳遞類型時不需要。將編輯。 (儘管在原始代碼中,除非實際上要傳遞與MyButton不同的'MyButton'的子類型,爲簡單起見,您可以使用'typeof(MyButton)')。 –