2011-10-07 99 views
0

我正在尋找一種解決方案來創建類的單例實例,只有類的名稱將可用。當我只有班級名稱時,如何創建實例?

我已經看過Activator.CreateInstance()但這需要重新發送到方法調用發生的原始對象。然後我進去看看如何MEF可能會提供幫助,這似乎是我想要去的路線,但我不確定這是否是我想達到的目標。

簡而言之,我引用了具有不同名稱的Web服務(ASMX)。當用戶將URL輸入到應用程序時,這些名稱將暴露給WinForms應用程序中的組合框。從那裏,需要調用每個服務公開的幾個方法,但是這些類將是抽象類中的虛擬方法。

這聽起來很像插件框架,但這裏的想法是根據安裝的基礎類型動態調用Office SharePoint Server(2007/2010)中的Microsoft特定Web服務。

希望我給了足夠的上下文。

回答

1

您使用的是C#4和.NET 4嗎?如果是這樣,你可以只使用:

Type type = Type.GetType(typeName); 
dynamic service = Activator.CreateInstance(type); 
service.FirstCommonMethod("foo", "bar"); 
service.SecondCommonMethod(); 

注意typeName必須至少是名稱空間限定的,如果類型是比mscorlib或調用組件以外的組件,它也應該是組件 - 合格。

+0

這個答案假定用戶有類的類型對象。在這個問題中,他們說他們只有班級的名字,大概是一個字符串。 –

+0

類似於'var type = Type.GetType(typeName);'在你的第一行之前會說明一個完整的解決方案。 –

+0

@NickStrupat:完成。 –

0

下面的代碼比使用Activator.CreateInstance稍快,但只是幾乎沒有。大多數情況下,我只是說明另一種方式來實例化一個對象Type

var type = Type.GetType(yourClassNamePossiblyWithLeadingNamespaces); 
var expressionNew = Expression.New(type); 
var typeFactory = Expression.Lambda<Func<dynamic>>(expressionNew).Compile(); 
var instanceOfClass = typeFactory(); 

編輯:同喬恩的回答是:這需要.NET 4和C#4使用dynamic

相關問題