C# Обобщенные делегаты c Обобщенными методами

м.б. кто-нибудь поможет!

Задача - передать обобщённый метод в другой класс.

Нерабочий код:


    class Program
        {
            static void Main(string[] args)
            {
                //Create B
                var bbb = new MyClassB(GetValue);
    
            }
    
    
            //обобщённый метод, который надо передать в класс MyClassB
            public static T GetValue<T>()
            {
                Type type = typeof(T);
                if (type == typeof(int))
                {
                    return (T)(object)5;
                }
    
                throw new NotSupportedException();
            }
        }

    public delegate T MyDel<T>();


    class MyClassB
    {
        public MyClassB(MyDel<Type> method)
        {
           var n=  method<int>(); //как вызвать метод?
        }


    }

Есть какие-нибудь идеи? Спасибо!


Ответы (1 шт):

Автор решения: Alexander Petrov

Если имеется делегат MyDel<T> method, то его вызов делается так: method().

Чтобы иметь возможность передавать такой делегат в конструктор, нужно задать обобщённый параметр типа на самом классе: class MyClassB<T>.

И, наконец, нужно явно указывать тип при создании делегата: GetValue<int>.

В итоге, получается примерно следующее:

class Program
{
    static void Main()
    {
        var b1 = new MyClassB<int>(GetValue<int>); // ok
        var b2 = new MyClassB<string>(GetValue<string>); // exception
    }
                
    public static T GetValue<T>()
    {
        Type type = typeof(T);
        if (type == typeof(int))
        {
            return (T)(object)5;
        }
        throw new NotSupportedException();
    }
}

public delegate T MyDel<T>();

class MyClassB<T>
{
    public MyClassB(MyDel<T> method)
    {
        var n = method();
        Console.WriteLine(n + " " + n.GetType());
    }
}

Возможно, это не то, что вам нужно. Опишите подробнее, что в конечном итоге хотите получить.

→ Ссылка