Передача обобщенного типа в другой метод/функцию

Вызываю из обобщенной функции другую функцию, передавая при этом туда обобщенный тип. Среда ругается на преобразование из типа 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 шт):

Автор решения: Igor
    if (!IsValid(ob as Sale) && !IsValid(ob as Category))
        return false;
→ Ссылка
Автор решения: 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 каждого объекта, который хранится в этой коллекции.

→ Ссылка