C# 从CreateInstance方法返回泛型类型
我似乎很难找到将Activator创建的实例强制转换并返回为其泛型类型的方法。我看过各种各样的例子……但似乎找不到一个“确切”的例子来说明我正在努力实现的目标C# 从CreateInstance方法返回泛型类型,c#,reflection,C#,Reflection,我似乎很难找到将Activator创建的实例强制转换并返回为其泛型类型的方法。我看过各种各样的例子……但似乎找不到一个“确切”的例子来说明我正在努力实现的目标 如何从下面的GetRepositoryInstance方法返回正确的类型 例如 public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class { } public class TransactionP
- 如何从下面的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;
}
}
公共类GenericRepository:i存储,其中tenty:class
{
}
公共类TransactionProvider:ITransactionProvider
{
公共void AddPending(ITransaction事务)
{
//获取目标类型
var typeEntity=GetTransactionEntityType(transaction.EntityName);
var typePendingEntity=GetTransactionPendingEntityType(transaction.EntityName);
//获取每种类型的存储库实例
var repositoryEntity=GetRepositoryInstance(typeEntity);
var repositoryPendingEntity=GetRepositoryInstance(typePendingEntity);
}
// -----
//这里…我想返回生成的类型作为它的“IRepository”…如何?
// -----
私有IRepository GetRepositoryInstance(类型实体)
{
var repositoryType=typeof(GenericRepository)。MakeGenericType(实体);
var repository=Activator.CreateInstance(repositoryType);
返回存储库;
}
}
更新:当然,任何解决方案仍然需要能够调用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
}
公共接口IRepository:IQueryable,IEnumerable,IEnumerable,IQueryable其中tenty:class
{
#区域
IQueryable AsQueryable();
无效删除(潜在实体);
作废删除列表(IList实体);
void DeleteAllOnSubmit(IEnumerable实体);
无效删除提交(实体);
无效插入(TEntity实体);
作废插入列表(IList实体);
作废InsertAllOnSubmit(IEnumerable实体);
无效插入提交(实体);
无效更新(潜在实体);
无效更新提交(潜在实体);
#端区
}
C语言中没有菱形操作符,但Java语言中却没有
因此,您无法访问封闭类型基础上的开放泛型类型,这会阻止泛型多态性
您可以尝试使用非泛型接口作为根,其中所有IRepository的iNerits都来自IRepository,这是不整洁的
private IRepository GetRepositoryInstance(Type entity);
需要记住的是,
IRepository
不是IRepository
的超级类型,它是一种永远无法实例化或分配的类型,只能用作typeof
的参数IRepository
定义了一组独立的类型,这些类型与继承无关,每个类型都有自己的静态变量,可能还有自己的内存布局
如果您想在构造的泛型类型族中实现可替换性,则需要引入一个公共超类型(或者只使用对象
)。乙二醇
使用系统;
命名空间控制台App30
{
公共类GenericRepository:i存储,其中tenty:class
{
}
公共接口IRepository:IRepository,其中tenty:class
{
}
公共接口假定
{
}
公共接口ITransaction
{
}
公共接口ITransactionProvider
{
}
公共类TransactionProvider:ITransactionProvider
{
公共void AddPending(ITransaction事务)
{
//获取目标类型
var-typeEntity=typeof(字符串);
var typePendingEntity=typeof(字符串);
//获取每种类型的存储库实例
var repositoryEntity=GetRepositoryInstance(typeEntity);
var repositoryPendingEntity=GetRepositoryInstance(typePendingEntity);
}
// -----
//这里…我想返回生成的类型作为它的“IRepository”…如何?
// -----
私有IRepository GetRepositoryInstance(类型实体)
{
var repositoryType=typeof(GenericRepository)。MakeGenericType(实体);
var repository=Activator.CreateInstance(repositoryType);
返回(IRepository)存储库;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var tp=新的TransactionProvider();
tp.AddPending(null);
控制台。WriteLine(“你好,世界!”);
}
}
}
您只有类型对象。所以,“如何”的答案是你没有。C#是静态编译的,但您使用的是运行时类型的对象。如果存在非通用的基本接口,那么最好将其转换为非通用的基本接口。为什么会被否决?这是一个合理的问题。不起作用…”使用泛型类型IRepository需要1个类型参数“您尝试了什么?它没有生成…这(上面)是消息您是否尝试使用MakeGenericType(typeof(entity))?或者MakeGenericType(new type[]{typeof(entity)})没有生成。。。“使用泛型类型IRepository需要1个类型参数”,它在.NET Framework和.NET Core中构建和运行。
using System;
namespace ConsoleApp30
{
public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
}
public interface IRepository<TEntity> : IRepository where TEntity : class
{
}
public interface IRepository
{
}
public interface ITransaction
{
}
public interface ITransactionProvider
{
}
public class TransactionProvider : ITransactionProvider
{
public void AddPending(ITransaction transaction)
{
// Get the targeted types
var typeEntity = typeof(string);
var typePendingEntity = typeof(string);
// 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 (IRepository)repository;
}
}
class Program
{
static void Main(string[] args)
{
var tp = new TransactionProvider();
tp.AddPending(null);
Console.WriteLine("Hello World!");
}
}
}