是否可以为任何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:

这对于委托是否可行?还有别的办法吗?

是否可以为任何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)
   {
   }
}