C#不同对象列表的通用方法

Sha*_*shi 5 .net c# generics c#-4.0

我在 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
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

有没有一种方法可以使用单一方法而不是三个不同的函数,因为冗余逻辑而难以维护。如果逻辑发生变化,则需要在所有三个地方进行更新。

Lem*_*eed 2

创建一个新界面:

public interface ILockable
{
    bool isListLocked();
}
Run Code Online (Sandbox Code Playgroud)

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

class Object1 : ILockable
{
    public IsLocked()
    {
        // Your code here...
    }
}
...
class Object2 : ILockable ...
class Object3 : ILockable ...
Run Code Online (Sandbox Code Playgroud)

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

private FilterLockedEntities(List<ILockable> list)
{
    // Your code here...
}
Run Code Online (Sandbox Code Playgroud)