Словарь обобщенных c функций с разными типами для каждой записи - PullRequest
1 голос
/ 29 апреля 2020

Можно ли добиться, набрав func в диктовке, с разными типами в качестве ключей и без произнесения в func.

Примерно так:

class Program
{
    class Person
    {
        public int Id { get; set; }
    }

    class Dog
    {
        public string Name { get; set; }
    }

    static void Main(string[] args)
    {
        var funcDict = new Dictionary<Type, Func<object, object, bool>>()
        {
            {typeof(Person), (Person p1, Person p2) => p1.Id == p2.Id},
            {typeof(Dog), (Dog d1, Dog d2) => d1.Name == d2.Name},
        };

        var p1 = new Person()
        {
            Id = 4
        };

        var p2 = new Person();

        Console.WriteLine(funcDict[p1.GetType()].Invoke(p1, p2));
    }
}

Лучшее, что я могу придумать, - это создание функций с object типами, а затем приведение в тело func, но, если возможно, хотелось бы избежать этого, потому что это привело бы к гораздо более чистому API.

var funcDict = new Dictionary<Type, Func<object, object, bool>>()
{
    {typeof(Person), (o1, o2) => ((Person) o1).Id == ((Person) o2).Id},
};

1 Ответ

1 голос
/ 29 апреля 2020

Короткий ответ будет отрицательным, если только вы не используете динамическую c печать. Но вы могли бы скрыть уродство:

public class FunctionDictionary
{
    private Dictionary<Type, object> dict = new Dictionary<Type, object>();
    public void Add<T>(Func<T, T, bool> method) => dict.Add(typeof(T), method);
    public bool Run<T>(T a, T b) => ((Func<T, T, bool>)dict[typeof(T)]).Invoke(a, b);
}

отказ от ответственности: нет обработки ошибок, не проверено.

Вы можете заменить «объект» на «Dynami c» в приведенном выше примере, чтобы получить избавиться от актерского состава. Но я бы, наверное, этого не сделал, поскольку он, вероятно, будет немного медленнее и не намного легче для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...