Обобщенные методы

92

В дополнение к обобщенным классам можно также определять обобщенные методы. В объявлении обобщенного метода присутствует обобщенный тип. Обобщенные методы могут быть определены внутри необобщенного класса.

В методах, объявляемых в обобщенных классах, может использоваться параметр типа из данного класса, а следовательно, такие методы автоматически становятся обобщенными по отношению к параметру типа. Но помимо этого имеется возможность объявить обобщенный метод со своими собственными параметрами типа и даже создать обобщенный метод, заключенный в необобщенном классе.

Ниже приведена общая форма объявления обобщенного метода:

возвращаемый_тип имя_метода<список_параметров_типа> (список_параметров) {// ...

В любом случае список_параметров_типа обозначает разделяемый запятой список параметров типа. Обратите внимание на то, что в объявлении обобщенного метода список параметров типа следует после имени метода.

В большинстве случаев неявной выводимости типов оказывается достаточно для вызова обобщенного метода, тем не менее аргументы типа могут быть указаны явным образом. Для этого достаточно указать аргументы типа после имени метода при его вызове. Стоит также отметить, что на аргументы обобщенного метода можно наложить ограничения, указав их после списка параметров.

Давайте рассмотрим пример:

using System;

namespace ConsoleApplication1
{
    // Создадим необобщенный класс
    class InfoObject
    {
        // Обобщенный метод использующий также ограничение
        public static string Info<T>(T obj) 
            where T : User
        {
            return obj.ToString();
        }
    }

    class User
    {
        public User(string Name, int Age)
        {
            this.Name = Name;
            this.Age = Age;
        }

        public string Name { get; set; }
        public int Age { get; set; }
    }

    class UserPass : User
    {
        public UserPass(string Name, int Age, string Pass)
            : base(Name, Age)
        {
            Password = Pass;
        }

        public string Password { get; set; }

        public override string ToString()
        {
            return String.Format(@"Информация о пользователе:
**************************
Имя: {0}
Возраст: {1}
Пароль: {2}",Name,Age,Password);
        }
    }

    class Program
    {
        static void Main()
        {
            UserPass user1 = new UserPass(Name: "Alex", Age: 26, Pass: "12345");

            // Вызываем обобщенный метод
            string s = InfoObject.Info<UserPass>(user1);
            Console.WriteLine(s);
            Console.ReadLine();
        }
    }
}
Использование обобщенных методов

Как видите в данном примере используется обобщенный метод Info<T> выводящий информацию об объекте. При этом в данном методе используется ограничение на базовый класс User с помощью оператора where. В производном классе UserPass переопределяется метод ToString(), в результате чего, в консоле отображается информация о пользователе.

Пройди тесты
Лучший чат для C# программистов