是否可以轉換為不知道實際泛型型別但知道該型別派生自某個共享介面的泛型介面型別?
我有一個通用介面:
public interface IFooGenericObjectProvider<TModel> where TModel : class, IBaseModelType
{
SomeObject ProvideSomeObject(TModel model);
}
類像這樣實作它:
public class SomeObjectProvider : IFooGenericObjectProvider<ConcreteModel>
{
public SomeObject ProvideSomeObject(ConcreteModel model)
{
// create instance of 'SomeObject' using 'ConcreteModel'
}
}
我正在創建IFooGenericObjectProvider<TModel>通過反射實作型別的型別實體/Activator.CreateInstance
這一切都很好,但是當我需要使用創建的型別時會出現問題。
IFooGenericObjectProvider<IBaseModelType>當我需要從實作的介面呼叫方法時,我試圖將它們強制轉換,并且由于所有ConcreteModel實體都派生自共享IBaseModelType介面,我認為這會非常好,但它會在強制轉換期間引發例外:
無法將“SomeObjectProvider”型別的物件轉換為“IFooGenericObjectProvider`1[IBaseModelType]”型別。
我可以通過更改為:
public class SomeObjectProvider : IFooGenericObjectProvider<IBaseModelType>
{}
然而,呼叫者提供了一個實體,IBaseModelType而不是ConcreteType我想要的:
public SomeObject ProvideSomeObject(IBaseModelType model)
{
// This works, but would like access to the concrete model type instead
}
我知道我可以IBaseModelType model轉換為具體型別,但這不是很好,并且是呼叫者的額外步驟。
我想要實作的目標是可能的嗎?也許還有另一種方法會更好?
uj5u.com熱心網友回復:
我可以通過對型別/實體的反射呼叫該方法來解決這個問題。
例如:
var providerInstance = ActivatorUtilities.CreateInstance(this.serviceProvider, providerType);
var someObject = providerType.InvokeMember("ProvideSomeObject", BindingFlags.InvokeMethod, null, providerInstance, new object[] { model });
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/523300.html
標籤:C#仿制药遗产反射界面
