在运行时创建未知类型的通用存储库

时间:2014-01-10 10:37:29

标签: c# generics repository-pattern

我在这里死了,试图用我的工作单元实现一个通用的存储库。这将适用于我正在进行的特定项目。但我只是无法掌握正确的语法。如果我只能将以下内容作为起点......

我希望能够做到

unit_of_work.Repository<don't-know-until-runtime>().Insert(run-time-object);

在运行时我不会知道我将要处理的是什么类型的对象,我只知道它将是'BaseClass'类型。

非常感谢您的帮助。我试着将代码放到下面。

public class BaseClass
{
}

public class SubClass1 : BaseClass
{
    public SubClass1()
        : base()
    {
    }
}

public interface IRepository<TEntity> where TEntity : class
{
    void Insert(TEntity entity);
}


public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
    public void Insert(TEntity entity)
    {
        System.Diagnostics.Debug.WriteLine("got here!!");
    }
}

public class UnitOfWork
{
    public virtual IRepository<TEntity> Repository<TEntity>() where TEntity : class
    {
        var type = typeof(TEntity).Name;
        var repositoryType = typeof(Repository<>);

        return (IRepository<TEntity>) Activator.CreateInstance(repositoryType.MakeGenericType(typeof(TEntity)));
    }
}

class Program
{
    static void Main(string[] args)
    {
        UnitOfWork unit_of_work = new UnitOfWork();

        SubClass1 testClass1 = new SubClass1();

        // this works fine, when I know the type in advance...
        unit_of_work.Repository<SubClass1>().Insert(testClass1);

        // ... but when I don't know the type, then what?
        // (All I know is that the incoming object will be of type BaseClass)
    }
}

1 个答案:

答案 0 :(得分:0)

使用BaseClass的必要类型约束声明您的存储库和UoW方法:

public interface IRepository<TEntity> where TEntity : BaseClass
...
public class Repository<TEntity> : IRepository<TEntity> where TEntity : BaseClass
...
public virtual IRepository<TEntity> Repository<TEntity>() where TEntity : BaseClass

然后你可以这样做:

unit_of_work.Repository<BaseClass>().Insert(<whatever>);

这是因为通用的逆转而起作用。