Добавить объект в список внутри метода, независимо от того, какой тип они

Я должен добавить объект в список. но во-первых, я должен проверить, действительно ли этот объект (свойство object.name) уже существует в списке и выполняет некоторые другие тесты. все это прекрасно работает, но я должен делать это с разными объектами и их списками. поэтому я хотел бы иметь метод, который принимает объект и список как параметры, и делает всю магию независимо от типа объекта и списка.

что я до сих пор:

список и объект:

ProductList = new ObservableCollection<product>();
private Product _newProduct = new Product();
public Product NewProduct
{
 get { return _newProduct; }
 set
 {
 if (_newProduct == value)
 return;
 _newProduct = value;
 RaisePropertyChanged("NewProduct");
 }
}
</product>

если объект существует:

bool productFound = false;
for (int i = 0; i < ProductList.Count; i++)
{
 if (ProductList[i].Name == NewProduct.Name)
 {
 productFound = true;
 break;
 }
}

после некоторых других тестов объект добавляется в список:

ProductList.Add(NewProduct.Clone());

вместо того, чтобы писать этот код для всех моих списков (5 разных типов), я хотел бы вызвать метод и передать объект и список. затем метод выполняет тесты и добавляет объект в список, независимо от того, какой тип они есть. Как я могу это сделать?

Я ищу что-то вроде этого:

Save(NewProduct, ProductList);
2 ответа

Объявите интерфейс и реализуйте его во всех необходимых вам объектах:

interface INamedEntity : ICloneable
{
 stirng Name { get; }
}

class Product : INamedEntity { /* ... */ }

Затем вы можете переписать код следующим образом:

void Save<t>(List<t> entities, T entity)
 where T: INamedEntity
{
 // searching if the object does exist:
 var isExists = entities.Any(e => e.Name == entity.Name);

 // after some other tests, the object is added to the list:
 entities.Add(entity.Clone());
}
</t></t>


вы можете использовать интерфейс, который имеет общие свойства и методы

interface IItem
{
 public string Name {set; get;}
}

то ваши классы должны реализовать интерфейс, например

class Product: Item { ...}

Теперь вы можете использовать следующий общий метод для сохранения элементов

public void Save(IItem item, List<iitem> list)
{

 if (!list.Any(x => x.Name == item.Name))
 list.Add(item);
}
</iitem>

licensed under cc by-sa 3.0 with attribution.