Ответ 1
Прежде всего, ваш код, который пытается установить два ограничения типа на общий параметр T1
, не компилирует
where T1 : Supplier, new()
where T1 : Employee, new()
со следующей ошибкой:
Условие ограничения уже указано для параметра типа "T1". Все ограничения для параметра типа должны быть указаны в одном предложении where.
В качестве статей статьи MSDN вы можете использовать только одно ограничение "where" для каждого общего параметра (см. http://msdn.microsoft.com/en-us/library/bb384067.aspx).
"С несколькими параметрами типа используйте одно предложение where для каждого параметра типа..."
Вы также не можете поместить несколько имен классов в одно ограничение 'where'. Только одно имя класса и несколько интерфейсов.
where T1 : Supplier, IContractor, IComparable, new()
Имейте в виду, что это ограничение диктует, что фактический тип, который вы предоставляете в качестве общего параметра T1, должен быть преемником самого класса поставщика или самого поставщика. И он должен реализовать интерфейсы IContractor
AND IComparable
.
Как только ваш метод примет объект MyEntity, и вы не укажете, какое отношение оно имеет к классам Employee и Supplier, я не могу догадаться, как этот класс MyEntity знает о классах Employee and Supplier и как это отношение помогает вам.
Единственное, что я могу предложить, это либо создать интерфейс или базовый класс, либо наследовать оба его класса. Это единственная причина, по которой я вижу создание универсального метода. Это может выглядеть так:
class Program
{
static void Main(string[] args)
{
Method1<Employee>();
Method1<Supplier>();
}
private static void Method1<T1>()
where T1 : IContractor, new()
{
}
}
public class Supplier : IContractor
{
string IContractor.Name
{
get{return "Employee name";}
}
}
public class Employee : IContractor
{
string IContractor.Name
{
get{return "Customer name";}
}
}
public interface IContractor
{
string Name
{
get;
}
}
Если у ваших классов-поставщиков и сотрудников нет что-то важное, что достаточно для создания общего интерфейса, который они могут реализовать, тогда вы не должны создавать общий метод для их обработки.
Создайте перегруженный метод для каждого из таких типов.
Представьте, что у вас есть два класса: Wife
и Wine
. Оба имеют атрибут Age
и того же типа. Но даже не думайте о создании общего интерфейса IAged
для этих классов. Суть классов и смысл Age
настолько различны, что их никогда не следует унифицировать. Тем не менее, некоторая общая логика вполне может вам помочь. Например:
private double AgeQualify(Wife someWife)
{
return 1 / (someWife.Age * someWife.Beachness);
}
private double AgeQualify(Wine someWine)
{
return someWine.Age / someWine.Sugar;
}