Конечно, можно. Но вы, вероятно, хотите переосмыслить то, как вы идете. Желание сократить код, который вам нужно написать, хорошо.
Билл Гейтс - «Я выбираю ленивый человек, чтобы сделать тяжелую работу. Потому что ленивый человек найдет простой способ сделать это ».
Но это не всегда необходимо, и может ввести ненужную сложность к чему-то, что в противном случае просто и понятно.
Подумайте, что происходит в вашем коде. У вас есть экзамен, с которым вы хотите что-то сделать. Предположительно, вы обеспокоены тем, что может быть более одного способа идентифицировать данный экзамен для разных пользователей. Но, что бы вы ни хотели, вероятно, не изменится. Итак, давайте атакуем с этого угла: нам нужно будет определить экзамен с учетом неизвестного параметра.
public Exam FindExamFromAnything(object input)
{
int examID = 0;
if (int.TryParse(input.ToString(), out examID))
{
return GetExamFromID(examID);
}
else
{
return GetExamFromName(input.ToString());
}
}
public Exam GetExamFromID(int ID)
{
// get the Exam with the right ID from a database or something
}
public Exam GetExamFromName(string examName)
{
// get the Exam with the right name from a database
}
Теперь у вас есть метод, который вы можете передать, и вы вернете то, что искали. Большой!
За исключением ... Через два года кто-то есть список студентов, которые приняли данный экзамен, и пытается использовать метод:
List<string> students = new List<string> {"Alice","Bob"};
var exam = FindExamFromAnything(students); // nope!
не работает. Но как он узнает? В подписи нет ничего, что указывало бы, что использовать в качестве объекта. Теперь он должен найти исходный код или использовать пробную версию и ошибку, чтобы выяснить, как использовать ваш API. Ваша документация может объяснить, что для нее требуется только int или строка, но ...
Вместо этого на самом деле не так много работы, чтобы написать второй метод. В качестве Scott Chamberlain points out вы можете перегрузить имя метода, чтобы принимать разные параметры. Лучшее решение для этой реализации должно стать более конкретным; Я частично отношусь к таким методам, как показано выше, то есть выставляйте свои GetExamFromString
и GetExamFromID
и все, что вам нужно, поэтому они сами объясняют.
Вам нужно будет создать конструктор для каждой подписи. –
Просто потому, что вы * можете * не означает, что вы * должны * – Brandon
Похоже, вы должны исследовать перегрузку метода. –