2016-01-16 35 views
0

可以說,我有一個名爲IMyInterface的接口,以及一個名爲MyClass的類,它實現IMyInterface的如何實例化通過參數傳遞的類型的對象,需要實現某個接口?

在另一類我有一個類型作爲參數的方法,該類型必須實現IMyInterface的是有效的。例如MyClass將是一個有效的參數。然後在該方法中,我將實例化一個由參數傳遞的類型的對象。

我該怎麼做到這一點?如果不可能,哪種解決方案會產生類似的效果?

+0

我不完全確定你在問什麼。你在問如何構造一個傳入的'Type'對象的對象,因爲它引用了一個實現了某個接口的類?還是你問如何驗證傳入的'Type'對象詳細說明了實現該接口的類?請澄清。 –

+0

我想知道如何讓一個給定類型的方法構造類型,但只有當類型實現了某個接口。所以這兩個問題我不得不說。對不起,如果我應該分成兩個職位。 –

+0

然後[@Vadim](http://stackoverflow.com/users/5649561/vadim-martynov)已經發布了您的答案。 –

回答

1

答案有兩部分。首先,你應該通過Type.IsAssignableFrom驗證類型:

var implementInterface = (typeof(IMyInterface)).IsAssignableFrom(type); 
if(!implementInterface) 
    // return null, throw an exception or handle this scenario in your own way 

接下來,您可以實例化一個對象。這裏有您可以創建一個特定類型的飛行的物體幾種方式,一種是使用Activator.CreateInstance

// create an object of the type 
var obj = (IMyInterface)Activator.CreateInstance(type); 

你會在OBJ獲得MyClass的實例。

另一種方法是使用反射:

// get public constructors 
var ctors = type.GetConstructors(BindingFlags.Public); 

// invoke the first public constructor with no parameters. 
var obj = ctors[0].Invoke(new object[] { }); 

而且從ConstructorInfo回來一個,你可以在「調用()」,它與參數並取回類的實例,如果你已經使用了「新」運營商。

+0

這正是我所需要的。我測試過,效果很好。謝謝! –

+1

好的,第一次工作,但後來它不再工作,我一定沒有適當的測試,因爲我想我應該使用「typeof(IMyInterface).IsAssignableFrom(type);」而不是「type.IsAssignableFrom(typeof(IMyInterface));」。其條件如下所示:https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom(v=vs.110).aspx?f=255&MSPPError=-2147217396&cs-save -lang = 1&cs-lang = csharp#code-snippet-1 其中一個表示「當前實例是c實現的接口」。 所以我想接口必須是調用方法的人。 –

相關問題