2011-05-02 58 views
4

在訪問Interviwer問我我們可以在運行時創建一個類的實例並通過代碼調用所有類的方法嗎? 爲類TestClass中的示例代碼如下我們可以在運行時創建類的實例並通過代碼調用類的所有方法嗎?

public class TestClass 
{ 
    public int ID 
    { 
     get; 
     set; 
    } 
    public string Name 
    { 
     get; 
     set; 
    } 
    public float Salary 
    { 
     get; 
     set; 
    } 
    public string Department 
    { 
     get; 
     set; 
    } 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
    public int Sub(int a, int b) 
    { 
     return a - b; 
    } 
}//end class 

現在我要創建這個類在運行時的實例,並在運行時調用的所有方法和屬性,任何一個可以解釋我如何可以存檔此。 2.以這種方式調用方法的好處/用途是什麼?

+4

據我所知,實例總是在運行時創建的。 – 2011-05-02 08:07:11

+0

這個問題在面試中問我。我想他想知道反思,即。我們如何通過反思來實現。 – Vijjendra 2011-05-02 08:12:43

回答

2

我想他是在問反射。在這裏和谷歌上都有關於這個話題的大量信息。
基本上,你想這樣做的原因是,你不知道編譯時的具體類型,需要在運行時動態找到它。
一個例子是一個簡單的插件系統,你需要插件來實現一個特定的接口。在運行時,您將所有程序集加載到指定文件夾中並使用反射,搜索實現該接口的類,然後創建該類的實例並調用該類的實例。

+0

是的,我正在談論反思。謝謝。 – Vijjendra 2011-05-02 08:11:24

4

是的,這是可能的。

要創建一個實例可以使用:

Type classType = Type.GetType("TestClass"); 
object instance = Activator.CreateInstance(classType); 

,然後調用Sub(23, 42)instance的樣子:使用

classType.InvokeMember("Sub", BindingFlags.InvokeMethod, null, instance, new object[] { 23, 42 }); 

反射(例如),當你不知道類型的編譯時間,並希望發現他們在運行時(例如在外部DLL,插件等)。

+0

既然我們知道'Activator.CreateInstance'返回一個'TestClass'類型的實例,'InvokeMember'沒有必要,對吧? – 2011-05-02 09:19:25

+0

@ christoffer-lette:在這個例子中,絕對。在實際代碼中,您不知道實例類型InvokeMember是必需的。 – 2011-05-02 09:22:42

+0

把它放在答案中,連同對使用已知接口類型或不使用已知接口類型的場景(即插件體系結構)的討論,並且您將有一個簡單的10個代表。 :-) – 2011-05-02 10:38:57

相關問題