Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从CreateInstance方法返回泛型类型_C#_Reflection - Fatal编程技术网

C# 从CreateInstance方法返回泛型类型

C# 从CreateInstance方法返回泛型类型,c#,reflection,C#,Reflection,我似乎很难找到将Activator创建的实例强制转换并返回为其泛型类型的方法。我看过各种各样的例子……但似乎找不到一个“确切”的例子来说明我正在努力实现的目标 如何从下面的GetRepositoryInstance方法返回正确的类型 例如 public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class { } public class TransactionP

我似乎很难找到将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;
    }
}
公共类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!");
        }
    }
}