c# - 从 CreateInstance 方法返回泛型类型
问题描述
我似乎很难找到一种将 Activator 创建的实例作为其泛型类型进行转换和返回的方法。我查看了各种示例……但似乎找不到我想要完成的“确切”示例。
- 如何从下面的 GetRepositoryInstance 方法返回正确的类型?
例如...
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# 中没有菱形运算符,但与 Java 中一样。
因此,您无法访问封闭类型基础的开放泛型类型,这会阻止泛型多态性。
您可以尝试使用非通用接口作为根,其中所有 IRepository 的 T ihnerits 都来自 IRepository,这是不整洁的。
private IRepository GetRepositoryInstance(Type entity);
推荐阅读
- javascript - 如何在 Firebase 中存储和检索用户聊天?
- gis - 如何在 OpenLayers 中完全隐藏地图?
- android - E/StorageException:发生了 StorageException。对象在该位置不存在
- javascript - 错误:未捕获的类型错误:this.beginPath 在定义原型函数时不是函数
- reporting-services - 特征线不起作用 SSRS 公式或计算字段?
- java - 如何在正则表达式中选择第 1 组中第一次出现的字符串?
- css - 将滑块转换为网格
- javascript - react-native 模态视图未在调试模式下显示
- node.js - CloudConvert 作业在导出时返回空结果,所有任务都列为等待
- ios - 为什么 swiftUI 中没有显示警报?