2016-02-08 3 views
2

У меня возникла ситуация в C# web api, где мне нужно будет получить список различных объектов из моей базы данных и вам нужно реализовать некоторую логику, вызвав различные методы.C# Общий метод для списка различных объектов

Как я могу лучше достичь этого путем написания функции общего для всех 3-х объектов

например

есть два сценария списка

блокировки
  1. весь список заблокирован (не исходящее и исключение исключений, если весь список заблокирован)

  2. только один объект заблокирован (фильтр d удалить этот элемент, если он заблокирован из списка)

    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

Вы можете изменить определение объектов? Одним простым способом было бы просто реализовать интерфейс с полем «IsLocked». – GBreen12

+0

Делает ли код в '// какой-то другой логике, общей для всех', со списками? Если да, то что и как? Если нет, то почему здесь код? – Enigmativity

ответ

2

Создание нового интерфейса:

public interface ILockable 
{ 
    bool isListLocked(); 
} 

Затем сделать ваш объект наследует интерфейс в своих объявлениях классов:

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

Затем сделайте вашу функцию приму в List из ILockable объектов:

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

С 'List ' is * not * 'Список ' это предложение было бы болью для реализации as-is. –

+0

Я предполагал, что 'Object1' thru' Object3' были настраиваемыми типами, и OP мог изменять типы, просто добавляя наследование интерфейса, поскольку методы уже реализованы на объекте. Если это не так, то да, это потребует создания производных объектов для реализации. – Lemonseed

+0

Вам действительно нужно попытаться передать 'List ' вашему методу и посмотреть, что произойдет. Создание копии «Список » просто для вызова вашего метода не очень хорошее решение. –

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 

} 

Немного излишне широким, на мой вкус, но, возможно, подходит вашей ситуации.

0

Если вы можете добавить интерфейс 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... 
} 
Смежные вопросы