Вот два способа:
- Использовать обобщенные значения и общий базовый класс
- Использовать интерфейсы
Метод 1:
public class BaseClass
{
public int SomeProperty { get; set; }
}
public class MyType : BaseClass { }
public class MyOtherType : BaseClass { }
public class ClassWithMethod
{
public static List<T> DoSomethingSimple<T>(List<T> myTypes)
where T : BaseClass
{
return myTypes.Where(myType => myType.SomeProperty.Equals(2)).ToList();
}
}
Метод 2:
public interface ICommon
{
int SomeProperty { get; set; }
}
public class MyType : ICommon
{
public int SomeProperty { get; set; }
}
public class MyOtherType : ICommon
{
public int SomeProperty { get; set; }
}
public class ClassWithMethod
{
public static List<T> DoSomethingSimple<T>(List<T> myTypes)
where T : ICommon
{
return myTypes.Where(myType => myType.SomeProperty.Equals(2)).ToList();
}
}
Теперь, если вы попытаетесь заставить метод использовать интерфейс напрямую, например так:
public class ClassWithMethod
{
public static List<ICommon> DoSomethingSimple(List<ICommon> myTypes)
{
return myTypes.Where(myType => myType.SomeProperty.Equals(2)).ToList();
}
}
Тогда это будет работать, если у вас есть List<ICommon>
, когда вы звоните, но не будет работать, если у вас есть List<MyType>
.В C # 4.0 это можно сделать, если мы немного изменим метод:
public class ClassWithMethod
{
public static List<ICommon> DoSomethingSimple(IEnumerable<ICommon> myTypes)
{
return myTypes.Where(myType => myType.SomeProperty.Equals(2)).ToList();
}
}
Обратите внимание, что вместо этого я использовал IEnumerable<ICommon>
.Понятие здесь называется ко- и противоречивостью, и помимо этого я не буду много говорить об этом.Search Stack Overflow для получения дополнительной информации о предмете.
Совет : я бы изменил входной параметр на IEnumerable<T>
независимо, так как это сделает ваш метод пригодным для использования в большем количестве случаев, вы могли быимеют разные типы коллекций, массивов и т. д. и если они содержат правильный тип, они могут быть переданы методу.Ограничивая себя List<T>
, вы заставляете пользователя своего кода преобразовывать в список в некоторых случаях.Мои рекомендации должны быть как можно более точными во входных параметрах и как можно более точными в выходных параметрах.