如何创建实现具有基类型的通用接口的类实例

时间:2014-12-11 08:15:32

标签: c# reflection interface

让我说我有这个:

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>,而我也不知道如何将其转换为相同的结果。基本上,我想创建一个这个服务的实例并调用preload。

不执行转换可以正常工作并创建一个实例但是因为我还没有将它转换为任何内容,我无法根据界面对其进行任何调用。

2 个答案:

答案 0 :(得分:3)

您的界面应该是协变的:

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

然后,分配就可以了:

IPreLoad<BaseEntity> preLoader = new ProductService();

答案 1 :(得分:0)

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

public interface IPreLoad
{
    void Preload();
}

public interface IPreLoad<T>: IPreload where T : BaseEntity 
{
   // your other typed methods...
}

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