首页 > 解决方案 > 从 CreateInstance 方法返回泛型类型

问题描述

我似乎很难找到一种将 Activator 创建的实例作为其泛型类型进行转换和返回的方法。我查看了各种示例……但似乎找不到我想要完成的“确切”示例。

例如...

public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
{

}

public class TransactionProvider : ITransactionProvider
{
    public void AddPending(ITransaction transaction)
    {
        // Get the targeted types
        var typeEntity = GetTransactionEntityType(transaction.EntityName);
        var typePendingEntity = GetTransactionPendingEntityType(transaction.EntityName);

        // Get the Repository Instances for each type
        var repositoryEntity = GetRepositoryInstance(typeEntity);
        var repositoryPendingEntity = GetRepositoryInstance(typePendingEntity);
    }

    // -----
    // HERE...I want to return the generated type as its' IRepository<>...how?
    // -----
    private IRepository<> GetRepositoryInstance(Type entity)
    {
        var repositoryType = typeof(GenericRepository<>).MakeGenericType(entity);
        var repository = Activator.CreateInstance(repositoryType);

        return repository;
    }
}

更新:
当然,任何解决方案仍然需要能够调用 IRepository 的方法

public interface IRepository<TEntity> : IQueryable<TEntity>, IEnumerable<TEntity>, IEnumerable, IQueryable where TEntity : class
{
    #region <Methods>

    IQueryable<TEntity> AsQueryable();

    void Delete(TEntity entity);

    void DeleteList(IList<TEntity> entities);

    void DeleteAllOnSubmit(IEnumerable<TEntity> entities);

    void DeleteOnSubmit(TEntity entity);

    void Insert(TEntity entity);

    void InsertList(IList<TEntity> entities);

    void InsertAllOnSubmit(IEnumerable<TEntity> entities);

    void InsertOnSubmit(TEntity entity);

    void Update(TEntity entity);

    void UpdateOnSubmit(TEntity entity);

    #endregion
}

标签: c#reflection

解决方案


C# 中没有菱形运算符,但与 Java 中一样。

因此,您无法访问封闭类型基础的开放泛型类型,这会阻止泛型多态性。

您可以尝试使用非通用接口作为根,其中所有 IRepository 的 T ihnerits 都来自 IRepository,这是不整洁的。

private IRepository GetRepositoryInstance(Type entity);

推荐阅读