Передача обобщенного типа в другой метод/функцию
Вызываю из обобщенной функции другую функцию, передавая при этом туда обобщенный тип. Среда ругается на преобразование из типа T в тип Sale. Как сделать, чтобы можно было из списка передавать любой класс(например, и category и sale)?
public bool IsValid(Category category)
{
if (category == null)
{
ErrorText = "Не указано поле 'Категория'";
return false;
}
if (String.IsNullOrEmpty(category.Name))
{
ErrorText = Properties.Resources.StringValidateError + $" Категория ID:{category.Id}";
return false;
}
return true;
}
public bool IsValid(Sale sale)
{
if(sale == null)
{
ErrorText = "Не указано поле 'Продажа'";
return false;
}
if(sale.Amount < 0)
{
ErrorText = Properties.Resources.AmountValidateError + $", Продавец: {sale.EmployeeId}, Товар: {sale.ProductId}";
return false;
}
return true;
}
public bool IsValid<T>(IEnumerable<T> listDTO)
{
foreach(T ob in listDTO)
{
if (!IsValid(ob))
return false;
}
return true;
}
Ответы (2 шт):
Автор решения: Sterlukin
→ Ссылка
Вам нужно создать интерфейс IValidatable (как подсказали в предыдущем ответе) и в нём сделать метод IsValid. От него унаследовать классы Sale, Category. В каждом из них сделать метод IsValid(). И тогда можно определить код обобщённого IsValid вот таким образом:
interface IValidatable
{
bool IsValid();
}
public class Sale : IValidatable
{
...
public bool IsValid()
{
// Здесь логика валидации для Sale
}
}
//Аналогичным образом сделать для Category и для всех други классов, которые будут
//валидироваться
public bool IsValid<T>(IEnumerable<T> listDTO) where T : IValidatable
{
foreach(T ob in listDTO)
{
if (!ob.IsValid())
return false;
}
return true;
}
В таком случае, будет вызываться метод IsValid каждого объекта, который хранится в этой коллекции.