C# 不同对象列表的泛型方法
本文关键字:泛型方法 列表 对象 | 更新日期: 2023-09-27 18:33:41
我在 C# web api 函数中遇到这种情况,我需要从数据库中检索不同对象的列表,并且需要通过调用各种方法来实现一些逻辑。
如何通过为所有 3 个对象编写一个泛型函数来更好地实现这一目标
例
锁定列表有两种情况
- 整个列表
被锁定(如果整个列表,则不要继续并引发异常列表已锁定)
仅锁定单个实体(筛选并删除)此元素(如果从列表中锁定)
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 }
我在三个函数中的每一个都有相同的逻辑,但具有不同实体的列表。
有没有办法让我使用一种方法而不是三个不同的功能,由于冗余逻辑而难以维护。如果逻辑发生变化,则需要在所有三个地方进行更新。
创建一个新接口:
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
}
对于我的口味来说有点不必要的宽泛,但也许适合你的情况。
如果可以添加接口IObject
到 Object1
、 Object2
和 Object3
,那么更多的泛型就是答案:
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...
}