Есть ли способ дать список только с именем функции, не зная тип списка? - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужна функция, чтобы получить все параметры объекта.Мои объекты хранятся в разных списках.Например, у меня есть список «Студенты» типа «Студент» и список «Лекторы» типа «Лектор».

    public static void getinfo(string objectname)
    {
        var foundobject = listname.Find(x => x.name == objectname);
        foundobject.info();
    }

Теперь я хочу найти объект с определенным именем (имя объекта) и указать список, в котором будет производиться поиск.Но я не знаю, как я мог передать имя списка моей функции.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете сделать его универсальным и передать 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...