可以說,我有一個名爲IMyInterface的接口,以及一個名爲MyClass的類,它實現IMyInterface的如何實例化通過參數傳遞的類型的對象,需要實現某個接口?
在另一類我有一個類型作爲參數的方法,該類型必須實現IMyInterface的是有效的。例如MyClass將是一個有效的參數。然後在該方法中,我將實例化一個由參數傳遞的類型的對象。
我該怎麼做到這一點?如果不可能,哪種解決方案會產生類似的效果?
可以說,我有一個名爲IMyInterface的接口,以及一個名爲MyClass的類,它實現IMyInterface的如何實例化通過參數傳遞的類型的對象,需要實現某個接口?
在另一類我有一個類型作爲參數的方法,該類型必須實現IMyInterface的是有效的。例如MyClass將是一個有效的參數。然後在該方法中,我將實例化一個由參數傳遞的類型的對象。
我該怎麼做到這一點?如果不可能,哪種解決方案會產生類似的效果?
答案有兩部分。首先,你應該通過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回來一個,你可以在「調用()」,它與參數並取回類的實例,如果你已經使用了「新」運營商。
這正是我所需要的。我測試過,效果很好。謝謝! –
好的,第一次工作,但後來它不再工作,我一定沒有適當的測試,因爲我想我應該使用「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實現的接口」。 所以我想接口必須是調用方法的人。 –
我不完全確定你在問什麼。你在問如何構造一個傳入的'Type'對象的對象,因爲它引用了一個實現了某個接口的類?還是你問如何驗證傳入的'Type'對象詳細說明了實現該接口的類?請澄清。 –
我想知道如何讓一個給定類型的方法構造類型,但只有當類型實現了某個接口。所以這兩個問題我不得不說。對不起,如果我應該分成兩個職位。 –
然後[@Vadim](http://stackoverflow.com/users/5649561/vadim-martynov)已經發布了您的答案。 –