是否可以为任何void方法使用委托或泛型?

时间:2014-08-19 19:48:10

标签: c# generics delegates

我正在尝试编写一个异常处理程序类,它将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;
    }
}

我想知道是否有办法编写可以调用我的void存储库方法的Delagate或Generic方法。

我以为我可以使用我在转换中使用的方法的接口

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:

代表可以这样做吗? 还有另一种方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

IT部门认为您拥有不同类型的密钥:用户拥有一个int密钥,而Groups拥有一个字符串密钥。所以我制作了一个通用界面,其方法没有类型参数,如下所示:

interface IRepository<TItem, TKey>
{
    void RemoveItem(TItem item);
    void RemoveByKey(TKey key);
    void RemoveByName(string name);
}

应该明确实施,但如果它没有发表评论。

编辑:您也可以这样做,但只有TKey和TItem永远不会相同,并且永远不会string

interface IRepository<TItem, TKey>
{
    void Remove(TItem item);
    void Remove(TKey key);
    void Remove(string name);
}

答案 1 :(得分:0)

您可以将通用参数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)
   {
   }
}