如何创建类的实例,实现具有基类型的泛型接口

本文关键字:实现 基类 泛型接口 类型 实例 创建 何创建 | 更新日期: 2023-09-27 18:34:04

假设我有这个:

public class BaseEntity {}
public class Product : BaseEntity {}
public interface IPreLoad<T> where T : BaseEntity 
{
    void Preload();
}
public class ProductService : IPreload<Product> 
{
    public void Preload()
    {
        //Do something
    }
}
//Returns list of types implementing IPreload<>
var preloaders = typeFinder.FindClassesOfType(typeof(IPreLoad<>)).ToList(); 
foreach (var preloaderType in preloaders)
{
    var preloader = (IPreLoad<BaseEntity>)EngineContext.Current.ResolveUnregistered(preloaderType);
    cacheManager.Get(preloader.PreLoadCacheKey, () => preloader.PreLoad());
}

遇到的问题是我无法将ProductService : IPreLoad<Product>投到IPreLoad<BaseEntity>,我不知道我还能如何投射它来达到相同的结果。基本上,我想创建此服务的实例并调用预加载。

不执行强制转换工作正常,它会创建一个实例,但由于我没有将其转换为任何东西,因此我无法根据接口对其进行任何调用。

如何创建类的实例,实现具有基类型的泛型接口

您的接口应该是协变的:

public interface IPreLoad<out T> where T : BaseEntity 
{
    void Preload();
}

然后,同意识就可以了:

IPreLoad<BaseEntity> preLoader = new ProductService();

在您的示例中,Preload 方法不受泛型类型 T 的影响,您可以使用非泛型接口,例如

public interface IPreLoad
{
    void Preload();
}
public interface IPreLoad<T>: IPreload where T : BaseEntity 
{
   // your other typed methods...
}

然后,将对象强制转换为IPreload而不是IPreLoad<BaseEntity>