2017-05-09 88 views
-4

我想以類似Java class.forName()的方式動態訪問c#中的類。我只找到Class.forName() equivalent in .NET?之類的東西,但我不想創建實例。在c#中等效的class.forName沒有創建實例

詳細:我有一個簡單的文本文件,其中包含一個類的列表。我使用file.ReadLine()(因此我已將所有類名稱作爲字符串)讀取它們,然後我想對每個類執行相同的靜態方法:class1.method(); class2.method;等等。這些類都存在,我需要訪問它們。我怎樣才能做到這一點?

+0

你試過'static'關鍵字嗎? https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/static – Stefan

+0

嘗試使用System.Reflection。您可能需要通過加載Assembly並執行傳入Flags的GetMethod來檢索所需的方法並執行它,以獲取MethodInfo。 – Gururaj

+1

@Pikoh _I我想對每個類執行相同的靜態方法_ – juharr

回答

3

C#不支持靜態接口(或接口的靜態成員),所以,除非你想用工廠類(通常方法),您需要使用反射來直接調用靜態方法。

void Main() 
{ 

    Console.WriteLine(Type.GetType("A").GetMethod("Hi").Invoke(null, new object[] {})); 
} 

class A 
{ 
    public static string Hi() { return "Hi!"; } 
} 

您可能想要使用該類型的完全限定名稱使其工作得很好。只使用類型的名稱是非常棘手的,特別是當你試圖從其他程序集中調用類型時(你可能是這樣,否則沒有理由使用反射 - 只需使用代表字典或其他)。

+0

謝謝。這似乎是我需要的。問題是在執行期間總是有NullReferenceException,儘管我確信這個類(你稱之爲「A」)存在。它也發生在像Console.WriteLine(Type.GetType(「A」)。ToString())這樣簡單的片段上,所以我認爲問題出現在getType()方法中。附加信息顯示「未在對象實例上設置對象引用」。我不明白,因爲我不需要/不想要一個實例(並且我的方法是靜態的!) – user5325622

+0

@ user5325622您不需要您的類型的實例,但您確實需要「Type」實例類型 - GetType在沒有找到類型時返回null。這就是爲什麼我提到你可能需要使用一個更合格的名稱,而不僅僅是「A」 - 一個完整的或程序集限定的名稱。您可以使用'typeof(A).AssemblyQualifiedName'來查看該類型的程序集限定名稱。如果你只是把我的示例代碼放在你的'Program'類中,'A'將會是一個嵌套類並且在一個名字空間中,所以你至少需要像'TestApp.Program + A'這樣的東西。 – Luaan

+0

謝謝。這對硬編碼的類名很有用。但是上面描述的具體情況如何:「我有一個包含類的列表的簡單文本文件(所以我已將所有類名稱作爲字符串)」?當我只將類名作爲字符串而不是類本身時,我無法明確地確定類的類型。 – user5325622

0

您可以使用System.Reflection將程序集加載到內存中,然後深入到該類型,然後獲取所需的方法並調用。

參考文檔

GetMethod

0

如果你有你想要的Type那麼你可以使用Type.GetType(string)方法的名稱。
例子,如果你有一類這樣的:該對象的

namespace MeProgram.BusinessLogic 
{ 
    public class MeObject {} 
} 

完整的類名稱應"MeProgram.BusinessLogic.MeObject"

現在你可以使用這個名字Type.GetType(string)方法裏面像這樣:

string className = "MeProgram.BusinessLogic.MeObject"; 
Type classType = Type.GetType(className);