2010-05-22 69 views
0

我有一個dll文件,我花了一個對象,從它和調用的函數,這個DLL裏面的物體,就像這樣:反思,調用

Command testClass = (Command)assembly.CreateInstance(creatObject);     
testClass.Execute(); 

我用反射由於某種原因。所以我需要使用調用函數&爲變量設置值,然後調用基本函數Exec​​ute。

以前我寫了下面的:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments); 
testClass.Execute(); 

,但它是沒有用的我。

我用下面的:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments); 
object returnValue1 = objectType.GetMethod("Execute").Invoke(classObject, null); 

我只想問,如果這是正確的,調用這種方式執行,並通過它的工作方式!

回答

1

這是不對的,你爲什麼要使用Reflection,提供一個通用接口並直接調用該方法。如果你不知道爲什麼你使用反射,那麼它是錯誤的:)

如果你正在實現一個可擴展的系統,也許MEF會更好?

3

調用方法使用反射你使用它的方式是「好的」,只要你知道你在做什麼。有相當多使用反射時要考慮幾件事情:

  • 這是不安全 - 你可以很容易犯了一個錯誤 - 如果你改變了方法的名稱,你會不會由編譯器和你通知會發現在運行時
  • 它是 - 反射是低效的 - 調用一個方法的速度要慢幾個數量級。

如果你只需要很少這樣做,那麼它可能會很好。但是,對於我來說,使用共享基類Command的初始方法似乎是一個更好的主意。你能否澄清爲什麼你決定使用反射,以便我們可以(也許)提出更好的方法?

如果需要動態調用,你也可以考慮使用C#4.0 dynamic,這的確這一切的東西現場爲你的背後,是比簡單的思考更有效率。但是,你應該有一個很好的理由來做這件事。

0

感謝您的回答,當然我知道我爲什麼使用反射。 因爲我需要在運行時爲函數setValues(i, j..etc)設置值,並且這些參數及其名稱與dll不同。 然後我必須用當前值調用此函數,&最後運行另一個名爲Execute()的函數,它具有相同的當前值,可以從程序的執行改變爲另一個值! 所以當我只是用:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments); 
testClass.Execute(); 

與被輸入的運行時間值執行沒有工作。 但由此:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments); 
object returnValue1 = objectType.GetMethod("Execute").Invoke(classObject, null); 

它的工作原理。 所以我只是想確定,我的工作是正確的,不僅適合我的情況!