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

时间:2016-02-08 23:43:15

标签: c# .net 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
    
    }
    
  3. 我在三个函数的每个函数中都有相同的逻辑,但是具有不同实体的List。

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

3 个答案:

答案 0 :(得分:2)

创建一个新界面:

public interface ILockable
{
    bool isListLocked();
}

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

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

然后让您的函数接受ListILockable个对象:

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

答案 1 :(得分:1)

您还可以尝试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

}

对我的口味有点不必要但也许适合你的情况。

答案 2 :(得分:0)

如果您可以向[{1}},IObjectObject1添加界面Object2,那么答案就会更多:

Object3