Вы можете сделать его универсальным и передать Func<T, string>
, чтобы получить свойство:
public static void GetInfo<T>(string objectname, List<T> list, Func<T, string> getProperty)
{
T foundobject = list.Find(x => getProperty(x) == objectname);
// ...
}
, и вы можете назвать его, например, следующим образом:
List<Lecturer> lecturers = new List<Lecturer>();
GetInfo("lecturername", lecturers, l => l.Name);
Теперь он говорит, что «T» не содержит определения «info», и не найдено никакого метода расширения «info», принимающего первый аргумент типа «T»
Причина этого заключается в том, чтоВы используете этот код в своем методе:
foundobject.info();
В моем универсальном методе еще нет ограничений, поэтому T
может быть любым объектом. Но ни у одного объекта нет метода info
. Так что вам нужноограничение, которое ограничивает возможные типы, которые можно использовать. Вы можете позволить своим классам реализовать общий интерфейс, такой как IInformable
, который имеет метод Info
:
public interface IInformable
{
void Info();
}
Но вместо того, чтобы позволить им реализовывать его напрямуювы могли бы позволить обоим классам наследовать от одного и того же класса Person
, поскольку у обоих есть Name
, и у каждого человека также должен быть один:
public abstract class Person : IInformable
{
public string Name { get; set; }
public void Info()
{
Console.WriteLine(Name); // for example
}
}
Я сделал это abstract
, так как люди не очень конкретныНо твои уроки:
public class Lecturer : Person
{
}
public class Student: Person
{
}
Теперь вы можете добавлять свойства к вашим классам, которые предназначены только для студентов и лекторов.
Выше общего метода требуется ограничение для IInformable
, потому что вы хотите вызвать Info
:
public static void GetInfo<T>(string objectname, List<T> list, Func<T, string> getProperty)
where T: IInformable
{
T foundobject = list.Find(x => getProperty(x) == objectname);
foundobject.Info();
}