是否可以为任何void方法使用委托或泛型?
本文关键字:泛型 方法 任何 void 是否 | 更新日期: 2023-09-27 18:18:48
我正试图编写一个异常处理程序类,从EF异常类型转换为HttpStatusCodes。我知道如何处理捕获并发送消息给ApiController。
public class ExceptionConverter : IExceptionConverter
{
//need the parameter
public HttpStatusCode Convert()
{
try
{
//call the void repository method here
}
catch (Exception exception)
{
if (exception is ObjectNotFoundException)
return HttpStatusCode.NotFound;
if (exception is InvalidOperationException)
return HttpStatusCode.BadRequest;
}
return HttpStatusCode.OK;
}
}
我想知道是否有一种方法可以编写一个delegate或Generic方法来调用我的void repository方法。
我在想我可以使用一个接口和我在转换中使用的方法
public interface IHandleCrudOperations
{
//All of these methods need to be able to take in many different parameters
//They will always need a parameter though
void Remove();
void Add();
void Edit();
void Clone();
}
正如您所看到的,我需要能够根据所讨论的存储库方法传入一系列不同的参数:
//userRepository
public void Remove(int userKey)
{
//stuff
}
//groupRepository
public void Remove(string groupName)
{
//stuff
}
//someOtherRepository
public void Remove(RemoveSomethingRequest request)
{
//stuff
}
我考虑使用泛型方法:
public interface IHandleCrudOperations
{
//All of these methods need to be able to take in many different parameters
//They will always need a parameter though
void Remove<T>(T item);
void Add<T>(T item);
void Edit<T>(T item);
void Clone<T>(T item);
}
现在实现变得困难了:
//userRepository
public void Remove<T>(T item)
{
//SERIOUS code smell here
var userKey = (int)(object)item
_context.Users.FirstOrDefault(x => x.UserKey == userKey);
//stuff
}
//groupRepository
public void Remove<T>(T item)
{
//SERIOUS code smell here
var groupName = (string)(object)item
//stuff
}
//someOtherRepository
public void Remove<T>(T item)
{
//SERIOUS code smell here
var request = (RemoveSomethingRequest)(object)item
//stuff
}
有很多不好的缺陷,可读性,滥用泛型,一般就是不好的....
因此,由于此操作的所有方法都返回void:
这对于委托是否可行?还有别的办法吗?
在我看来你有不同类型的键:用户有一个int键,组有一个string键。所以我要创建一个泛型接口,它的方法没有类型参数,像这样:
interface IRepository<TItem, TKey>
{
void RemoveItem(TItem item);
void RemoveByKey(TKey key);
void RemoveByName(string name);
}
实现应该是清晰的,但如果不是,请留下评论。
编辑:您也可以这样做,但前提是TKey和item永远不相同,并且永远不是string
:
interface IRepository<TItem, TKey>
{
void Remove(TItem item);
void Remove(TKey key);
void Remove(string name);
}
您可以将通用参数T
移动到接口本身:
public interface IHandleCrudOperations<TKey, T>
{
void Remove(TKey item);
void Add(T item);
void Edit(T item);
void Clone(T item);
}
public class UserRepository : IHandleCrudOperations<int, User>
{
public void Remove(int userKey)
{
_context.Users.FirstOrDefault(x => x.UserKey == userKey);
//stuff
}
public void Add(User user)
{
}
}