2010-05-07 52 views
7

我有情況我有使用反射來調用接口的方法,這樣.NET反射:如何在不創建實例的情況下調用接口的方法?

object x = null; 
MethodInfo method = interfaceExists.GetMethod("ShutDown"); 
method.Invoke(x, new object[] { 4 }) 

正如你可以看到,我不對象的創建實例!而且,我可以認爲,我收到例外

非靜態方法需要一個目標

和問題,我可以調用使用反射界面的方法,而無需創建接口的實例,如果是,如何我能行 ?

+0

想想這樣:如果你可以調用它,這個方法實際上會做什麼? – Aaronaught 2010-05-07 13:53:50

回答

12

接口方法不會影響對象狀態(這通常是一個非常糟糕的假設),您可以通過調用FormatterServices.GetUnitializedObject而不調用構造函數來創建實例。就個人而言,我強烈建議不要這樣做,因爲在調用未初始化類型的接口方法時,可能會發生許多不好的事情。

+3

祕密忍者技巧+1。 – Will 2010-05-07 14:02:21

+0

謝謝,這對我來說可能是合理的 – jitm 2010-05-07 21:58:14

10

如果它是一個實例方法,則需要一個實例來調用該方法。因此「實例」方法。

實例方法可以具有實例變量的依賴關係,這種反射不會知道,所以它不能保證實例方法不會改變它定義類型的實例的狀態。

這就是爲什麼你會得到有關FxCop警告(在這裏解釋)「使這個方法是靜態的,因爲它不會改變類的狀態」。

+0

如何使界面靜態方法? – jitm 2010-05-07 13:47:17

+0

您不能在接口上使用靜態方法。如果您不希望將該類標記爲抽象類,並實現該接口,那麼您將需要類上的靜態方法,然後從中派生出它的子類。 – Ian 2010-05-07 13:50:06

+0

@jitm你不能。如果你真的需要這樣做,可以考慮爲你的基類放棄你的接口。當然,你不能覆蓋基類的靜態方法,所以你可能仍然被搞砸了。嘗試詢問另一個關於SO的問題(不要使用這個問題),詳細說明你正在嘗試做什麼,並詢問是否有更好的方法。 – Will 2010-05-07 13:50:33

4

如果該方法是非靜態的,則必須創建一個對象實例才能使用它。由於接口不能有靜態方法,所以你需要創建一個帶有接口的對象實例來執行該方法。

1

一個接口沒有實現,因此如果沒有實現該接口的對象實例就無法調用它的方法。

2

您的非靜態接口方法最終需要調用在對象上實現的方法。如果該方法的實現不存在,則不能調用真正的方法。

1

你可以在不創建實例的情況下調用接口方法嗎?不是。接口是例如成員;靜態類成員與接口無關。

你也許能夠得到你想要的東西提供了一個靜態接口的實現,

public class MyImplementation : IMyInterface 
{ 
    public static readonly Instance = new MyImplementation(); 
    private MyImplementation() { } 
} 
// ...then your code might look like: 
MethodInfo method = typeof(IMyInterface).GetMethod("ShutDown"); 
method.Invoke(MyImplementation.Instance, new object[] { 4 }) 

或者你可以做一個擴展方法:如果你是絕對相信

public static class MyExtensions 
{ 
    public static void ShutDown(this IMyInterface obj, ...) { ... } 
} 
// ...then your code might look like: 
object x = null; 
MethodInfo method = typeof(MyExtensions).GetMethod("ShutDown"); 
method.Invoke(x as IMyInterface, new object[] { 4 }); 
+0

謝謝,我知道。 – jitm 2010-05-07 21:47:59

相關問題