3

我有以下界面

public interface IRepository<T> where T : IEntity, new()
{
    List<T> GetAll();
}

我在这里实现的

public abstract partial class WhsePricingRatesAddOnProviderBase : WhsePricingRatesAddOnProviderBaseCore, IRepository<WhsePricingRatesAddOn>
{
    /// <summary>
    /// Gets all rows from the DataSource.
    /// </summary>
    /// <returns>Returns a TList of Entity objects.</returns>
    public override List<WhsePricingRatesAddOn> GetAll()
    {
        return base.GetAll();
    }
}

也在这里

我在这里实现的

public abstract partial class WhsePricingRatesAddOn2ProviderBase : WhsePricingRatesAddOn2ProviderBaseCore, IRepository<WhsePricingRatesAddOn2>
{
    /// <summary>
    /// Gets all rows from the DataSource.
    /// </summary>
    /// <returns>Returns a TList of Entity objects.</returns>
    public override List<WhsePricingRatesAddOn2> GetAll()
    {
        return base.GetAll();
    }
}

当我尝试在课堂上使用它时

 public class TypeRate
    {
        public IRepository Repository { get; set; }

        public TypeRate(int i)
        {
    if (i == 1)
            {
                Repository = (IRepository<WhsePricingRatesAddOn>)SCMSDevMaster.Data.DataRepository.WhsePricingRatesAddOnProvider;}
    else
            {
                Repository = (IRepository<WhsePricingRatesAddOn2>)SCMSDevMaster.Data.DataRepository.WhsePricingRatesAddOn2Provider;}
            }
        }
    }

如果我没有在 IRepository 声明之后放置 <T>,我会收到此错误

使用泛型类型 'IRepository<T>' 需要一个参数。

或者如果我把它,那么我得到

找不到命名空间名称“T”的类型错误

我希望我的 TypeRate 类在创建运行时之前不知道 T,此时我将使用代码为存储库设置正确的 T。

我看错了吗?

我应该指出SCMSDevMaster.Data.DataRepository.WhsePricingRatesAddOnProvider是静态的;

4

3 回答 3

3

问题是你的Repository属性声明 - 你只需要指定类型参数,你可以直接这样做,因为你只有一种可以工作的类型,看起来:

public IRepository<WhsePricingRatesAddOn> Repository { get; set; } 

我不明白你为什么说你不想TypeRate知道 的类型T,因为它在构造函数中明确设置......

也可以制作TypeRate泛型(即制作它TypeRate<T>并将您的属性声明为IRepository<T>),但是构造函数主体不会编译,因为它显式转换为IRepository<WhsePricingRatesAddOn>.

有可能你可以引入一个非泛型 IRepository接口作为一个超接口IRepository<T>- 但你已经有了IEntity,你要添加的只是GetAll()依赖于T...的方法

从根本上说,我认为您确实需要决定在编译时知道哪些信息以及仅在执行时才知道哪些信息-因为听起来您目前的要求不一致。

于 2013-08-12T13:34:43.167 回答
3

这个定义

public IRepository Repository { get; set; } 

不完整,因为没有一个类(或接口)被称为IRepository. 有一个带有一个类型参数的通用接口称为IRepository,但这是另一回事。

Repository用具体的指定类型声明,如下所示:

public IRepository<WhsePricingRatesAddOn> Repository { get; set; } 

另一方面,如果您需要不同的存储库类型,问题将出在以下行:

SCMSDevMaster.Data.DataRepository.WhsePricingRatesAddOnProvider

这是尽可能具体的。我看不出如何在不进行重大重新设计的情况下使该部分动态化,而且我没有足够的关于您的设计的信息来提供进一步的建议。

于 2013-08-12T13:34:57.320 回答
0

您可以尝试使用通用方法而不是通用接口。然后,您不必使用特定类型声明您的 IRepository 接口。

public interface IRepository
{
    List<T> GetAll<T>() where T : IEntity;
}

public class TypeRate
{
    public IRepository Repository { get; private set; } 

    public TypeRate(IRepository repository)
    {
         Repository = repository;
    }
    public List<YourType> Get()
    {
        return this.Repository.GetAll<YourType>();
    }
}
于 2013-08-12T13:42:30.900 回答