@Anonymous12344321

Как обратиться к методу класса, если в параметр типа передается T?

Имеется два класса:
public class Student
    {
        public static Student Parse(string str)
        {
            Student s = new Student();

            return s;
        }
    }

    public class Teacher
    {
        public static Teacher Parse(string str)
        {
            Teacher t = new Teacher();

            return t;
        }
    }

В данных классах есть метод Parse, который принимает из файла строку и после проверки(здесь не представлена) создает экземпляр текущего класса с переданными в его конструктор данными из строки и возвращает его. Для считывания данных из файла, чтобы избежать дублирования кода, была создана функция
static void ReadFile<T>(string file, University u)
        {
            using (var sr = new StreamReader(file, Encoding.GetEncoding("windows-1251")))
            {
                string str = "";
                int lineNumber = 1;

                while ((str = sr.ReadLine()) != null)
                {
                    if (T.Parse(str) != null) // Parse вернет null, если строка некорректна
                        u.Add(T.Parse(str)); // в University добавляется готовый объект
                    else
                        Console.WriteLine("Некорректно введенные данные в файле in.txt в строке " + lineNumber);

                    lineNumber++;
                }
            }
        }


Для хранения данных о студентах и учителях есть два файла, teachers.txt и students.txt. У учителей и студентов в файлах присутствуют различные данные. Проблема в том, что в функцию ReadFile вместо T будет передаваться либо Student, либо Teacher. Но каким образом в теле цикла в условном операторе обратиться к их статическому методу Parse?(в приведенном коде ошибка). Т.е не получается обратиться к T.Parse(), тк T заранее не известен, но можно ли написать какую-нибудь конструкцию, чтобы уже в процессе выполнения программы по переданному параметру Т обращаться к функции Parse?(или прекращать выполнение подпрограммы, если T некорректен)
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
Сейчас - никак. Женерики никак не прокрывают статические методы. (но такая фича будет в .net 7 либо в экспериментальных фичах .net 6)

Попробуйте переписать код, чтобы не было static-ов.
T заранее не известен, но можно ли написать какую-нибудь конструкцию, чтобы уже в процессе выполнения программы по переданному параметру Т обращаться к функции Parse?(или прекращать выполнение подпрограммы, если T некорректен)


Храните где-нибудь Dictionary<Type, IParser> parsers
У которого IParser - interface IParser { object Parse(string str); }
Тогда будет что-то такое:
var parser = parsers[typeof(T)];
if(parser.Parse(str) is T data)
  u.Add(data);
else
  Console.WriteLine("Некорректно введенные данные в файле in.txt в строке " + lineNumber);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы