获取泛型类型的特定类型

时间:2013-02-28 11:16:18

标签: c# c#-4.0

我有一个通用的存储库类。

public class Repository<TEntity> where TEntity : class
{
    public virtual TEntity Create()
    {
        // Create implementation.
    }
    public virtual bool Add(TEntity entity)
    {
        // Add implementation.
    }
    public virtual bool Delete(TEntity entity)
    {
        // Delete implementation.
    }
    public virtual int SaveChanges()
    {
        // Save changes implementation.
    }
}

我有几种与beheaviour不完全匹配的类型,主要用于Create方法,所以我想做一个具体的实现。

类似的东西:

public class SpecificEntityRepository : Repository<SpecificEntity>
{
    public override SpecificEntity Create()
    {
        // Other create implementation.
    }
}

如果某个人使用Repository<SpecificEntity>返回SpecificEntityRepository方法的值,有没有办法,例如在SpecificEntityRepository的构造函数中返回Repository<>时参数类型等于SpecificEntity

我正在寻找一种通用的方法来做到这一点。在我的项目的最终版本中最多可以有200个特定的存储库,其中95%的功能是通用的。

2 个答案:

答案 0 :(得分:1)

如果您想阻止人们创建Repository<SpecificEntity>,您可以创建Repository构造函数protected并仅允许通过工厂方法创建实例。

例如:

public class Repository<TEntity> where TEntity : class
{
    private static readonly Dictionary<Type, Func<object>> specificRepositories =
        new Dictionary<Type, Func<object>>
        {
            { typeof(SpecificEntity), () => new SpecificRepository() }
        };

    protected Repository() {}

    public static Repository<T> Create<T>() where T : class
    {
        var entityType = typeof(T);
        if (specificRepositories.ContainsKey(entityType)) {
            return (Repository<T>)specificRepositories[entityType]();
        }
        else {
            return new Repository<T>();
        }
    }

    // default implementations omitted
}

我基于Dictionary上的实体类型基于存储库实例的解析,因为维护起来更方便,但如果我们只讨论几种特定的存储库类型,您可以使用{{ 1}} / if代替。

答案 1 :(得分:1)

一旦调用了特定的构造函数,就无法更改对象的类 但是你可以使用工厂方法而不是直接调用实际的构造函数:

public static Repository<T> CreateRepository<T>() {
    if (typeof(T) == typeof(SpecificEntity)) {
        return new SpecificEntityRepository();
    }
    return new Repository<T>();
}

要确保使用它,您应该保护实际的构造函数。