这是我正在使用的通用类:
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>
}
答案 0 :(得分:6)
public class BarRepository : Repository<Bar>
{
RepositoryInstructionResult Add(Bar item)
{ //different implementation to Repository<T>.Add() }
//other methods inherit from Repository<T>
}
答案 1 :(得分:0)
将您的Repository类命名为RepositoryBase并使接口方法成为虚拟。 在RepositoryBase类中以一般方式实现它们,但是因为你将方法标记为虚拟u将能够覆盖派生类中的功能,所以代码看起来就像这样。
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 Object的更新方法执行一些自定义逻辑,只需创建派生类名称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
}
}
答案 2 :(得分:0)
作为您问题的直接答案:与您所展示的最接近的事情是在运行时检查T
的实际值。在你的add方法中,你可以这样写:
if (typeof(T) == typeof(Bar)) {
// your Bar-specific code
}
// ...
请注意,这在性能方面可能不是很好,特别是如果您想要区别对待多于一种或两种此类特殊类型。
除此之外,唯一的解决方案是一个子类,它指定基类的实际类型参数,如其他答案中所述。
答案 3 :(得分:0)
使用扩展方法:
public static void DoSomething(this repository<Bar> repo)
{
//your custom code goes here
}