我使用的是第三方組件通過一個靜態類提供的服務:C#'動態'變量可以引用靜態類型嗎?
dynamic lib = new Foo.Bar.NotStaticLibraryClass();
lib.Start();
var x = lib.GetSomeStuff();
lib.Stop();
:
Foo.Bar.StaticLibraryClass.Start();
var x = Foo.Bar.StaticLibraryClass.GetSomeStuff();
Foo.Bar.StaticLibraryClass.Stop();
如果該類不是靜態的,我可以通過一個動態類型的變量使用它的一個實例
不幸的是,這個類是靜態的。有沒有我能寫的東西能讓我以同樣的方式工作?
dynamic lib = /* ??????? */
lib.Start();
var x = lib.GetSomeStuff();
lib.Stop();
(爲什麼我想使用dynamic
變量來訪問一個完美的.NET類型?實際上有庫DLL的多個版本,我必須找出並加載在運行合適的一個。不同的DLL公開了相同的類型和方法名稱,但它們是從任何通用接口繼承而來的,所以如果我能找到一種使用動態類型的方法,它將使我無需編寫大量簡單的反射代碼來使用DLL的方法)
動態關鍵字的主要用途是從靜態語言到動態語言或COM對象的橋接,這是正確的。然而它不限於這種用途。例如,我可以編寫以下代碼,它可以正常工作:'dynamic st1 =「test」;動態st2 = st1.ToUpper();字符串st3 = st2.ToString();'我碰巧有一個用例,我需要加載不同版本的程序集,從中我不能要求任何通用接口,即使它們在內部具有相似的類型名稱。使用'dynamic'可以讓我避免大量的手動反射。 – Eric 2010-06-23 15:28:29
@Eric:'dynamic'對於已經加載的類型很有用(我猜)。因此,加載程序集必須手動完成。 創建一個類型的實例(使用'Activator.CreateInstance')並將其分配給一個'dynamic'變量應該有助於這種情況。 – shahkalpesh 2010-06-23 17:57:16
這是一個靜態類型,所以'Activator.CreateInstance'不應該工作... – Eric 2010-06-23 19:36:22