Вызов метода делегата из универсального класса - PullRequest
0 голосов
/ 12 июня 2019

Я хотел бы вызвать MyDelegateMethod из SomeClass, но я не знаю, как это сделать. Я хочу, чтобы мой класс работал на каждого делегата, а не только на тот, который указан в примере кода.

спасибо!

using System;

namespace SomeTest
{
    public class Program
    {
        public delegate int MyDelegate(string str);
        public static int MyDelegateMethod(string str) => str.Length;

        public static void Main(string[] args)
        {
            var test = new SomeClass<MyDelegate>(MyDelegateMethod);
            test.Test();

        } 
    }

    public class SomeClass<SomeDelegate> where SomeDelegate : class
    {
        SomeDelegate MyDelegateMethod;

        public SomeClass(SomeDelegate MyDelegateMethod) => this.MyDelegateMethod = MyDelegateMethod;
                                             /* this part of code fails */
        public void Test() => Console.WriteLine(MyDelegateMethod("Test"));
    }
}

1 Ответ

1 голос
/ 12 июня 2019

В специальном случае вы можете использовать Func<string, int> вместо делегата, как это:

public class Program
{

    public static int MyDelegateMethod(string str) => str.Length;

    public static void Main(string[] args)
    {
        var test = new SomeClass(MyDelegateMethod);
        test.Test();

    }
}

public class SomeClass
{
    Func<string, int> MyDelegateMethod;

    public SomeClass(Func<string, int> MyDelegateMethod) => this.MyDelegateMethod = MyDelegateMethod;

    public void Test() => Console.WriteLine(MyDelegateMethod("Test"));
}

И вы можете обобщить это для любой функции ввода / вывода:

public class Program
{

    public static int MyDelegateMethod(string str) => str.Length;

    public static void Main(string[] args)
    {
        var test = new SomeClass<string, int>(MyDelegateMethod);
        test.Test("Test");

    }
}

public class SomeClass<TIn, TOut>
{
    Func<TIn, TOut> MyDelegateMethod;

    public SomeClass(Func<TIn, TOut> MyDelegateMethod) => this.MyDelegateMethod = MyDelegateMethod;

    public void Test(TIn input) => Console.WriteLine(MyDelegateMethod(input));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...