7

这是我正在使用的通用类:

 public interface IRepository<T> where T : EntityObject
{
    RepositoryInstructionResult Add(T item);
    RepositoryInstructionResult Update(T item);
    RepositoryInstructionResult Delete(T item);
}
public class Repository<T> : IRepository<T> where T : EntityObject
{

    RepositoryInstructionResult Add(T item)
    { //implementation}
    RepositoryInstructionResult Update(T item);
    { //implementation}
    RepositoryInstructionResult Delete(T item);
    { //implementation}
 }

现在,我希望偶尔在 t :特定类型时更改方法的行为。可能会出现以下情况吗?这种特殊的尝试会产生错误(错误 5:“存储库”的部分声明必须以相同的顺序具有相同的类型参数名称)。

public class Repository<Bar> //where Bar : EntityObject
{
    RepositoryInstructionResult Add(Bar item)
    { //different implementation to Repository<T>.Add() }
    //other methods inherit from Repository<T>
 }
4

4 回答 4

8
public class BarRepository : Repository<Bar>
{ 
    RepositoryInstructionResult Add(Bar item) 
    { //different implementation to Repository<T>.Add() } 
    //other methods inherit from Repository<T> 
} 
于 2012-06-14T13:42:25.067 回答
2

将您的 Repository 类命名为 RepositoryBase 并将接口方法设为虚拟。在您的 RepositoryBase 类中以一般方式实现它们,但是因为您将方法标记为虚拟您将能够覆盖派生类中的功能,您的代码将看起来像这样。

 public interface IRepository<T> where T : EntityObject
 {
    RepositoryInstructionResult Add(T item);
    RepositoryInstructionResult Update(T item);
    RepositoryInstructionResult Delete(T item);
 }

 public class Repository<T> : IRepository<T> where T : EntityObject
 {
    virtual RepositoryInstructionResult Add(T item)
    { //implementation}
    virtual RepositoryInstructionResult Update(T item);
    { //implementation}
    virtual RepositoryInstructionResult Delete(T item);
    { //implementation}
  }

如果您需要为 Bar 对象的更新方法执行一些自定义逻辑,只需创建派生类,将其命名为 BarRepository 并在此处覆盖 Repositorybase 类的更新方法,您可以调用基本实现或仅使用其自己的逻辑进行处理

 public class BarRepository : Repositorybase<Bar>
 {
    public override RepositoryInstructionResult Update(Bar item);
    {
       //Call base method if needed
       //Base.Update(item);

       //implement your custom logic here
    }
  }
于 2012-06-14T14:07:01.933 回答
0

作为对您问题的直接回答:与您所展示的内容最接近的可能是检查T运行时的实际值。在您的 add 方法中,您可以编写如下内容:

if (typeof(T) == typeof(Bar)) {
    // your Bar-specific code
}
// ...

请注意,这在性能方面可能不是很好,特别是如果您有超过一两个这样的特殊类型,您想要区别对待。

除此之外,唯一的解决方案是指定基类的实际类型参数的子类,如其他答案中所述。

于 2012-06-14T14:17:57.083 回答
0

使用扩展方法:

public static void DoSomething(this repository<Bar> repo)
{
  //your custom code goes here
}
于 2016-06-19T11:24:08.197 回答