C# 不同对象列表的泛型方法

本文关键字:泛型方法 列表 对象 | 更新日期: 2023-09-27 18:33:41

我在 C# web api 函数中遇到这种情况,我需要从数据库中检索不同对象的列表,并且需要通过调用各种方法来实现一些逻辑。

如何通过为所有 3 个对象编写一个泛型函数来更好地实现这一目标

锁定列表有两种情况

    整个列表
  1. 被锁定(如果整个列表,则不要继续并引发异常列表已锁定)

  2. 仅锁定单个实体(筛选并删除)此元素(如果从列表中锁定)

    List<Object1> list1;
    List<Object2> list2;
    List<Object3> list3;
    private FilterLockedEntities(List<Object1> list1){
       if(list1[0].isListLocked) //whole list is locked
         throw ValidationException("Message")
       list1.RemoveAll(a => a.IsLocked); //filter locked entities
       //some more logic common to all
    }
    private FilterLockedEntities(List<Object2> list2){
       if(list2[0].isListLocked) //whole list is locked
         throw ValidationException("Message")
       list2.RemoveAll(a => a.IsLocked); //filter locked entities
       //some more logic common to all
    }
    private FilterLockedEntities(List<Object3> list3){
       if(list3[0].isListLocked) //whole list is locked
         throw ValidationException("Message")
       list3.RemoveAll(a => a.IsLocked); //filter locked entities
       //some more logic common to all
    }
    

我在三个函数中的每一个都有相同的逻辑,但具有不同实体的列表。

有没有办法让我使用一种方法而不是三个不同的功能,由于冗余逻辑而难以维护。如果逻辑发生变化,则需要在所有三个地方进行更新。

C# 不同对象列表的泛型方法

创建一个新接口:

public interface ILockable
{
    bool isListLocked();
}

然后让你的对象继承其类声明中的接口:

class Object1 : ILockable
{
    public IsLocked()
    {
        // Your code here...
    }
}
...
class Object2 : ILockable ...
class Object3 : ILockable ...

然后让你的函数接受ILockable对象的List

private FilterLockedEntities(List<ILockable> list)
{
    // Your code here...
}
您也可以

尝试dynamic

private FilterLockedEntities(dynamic list1){
   if(list1[0].isListLocked) //whole list is locked
     throw ValidationException("Message")
   list1.RemoveAll(a => a.IsLocked); //filter locked entities
   //some more logic common to all
}

对于我的口味来说有点不必要的宽泛,但也许适合你的情况。

如果可以添加接口IObjectObject1Object2Object3 ,那么更多的泛型就是答案:

public interface IObject
{
    bool isLockedList { get; }
    bool IsLocked { get; }
}
private void FilterLockedEntities<T>(List<T> list) where T : IObject
{
    // same code as above should work here...
}