Общее наследование и делегаты - PullRequest
2 голосов
/ 08 декабря 2011

Прямо в точку.Допустим, у меня есть простая модель наследования

class Base {}
class Inh : Base {}

, и я хочу сделать что-то вроде этого (примечание - этот код не компилируется):

class Test
{
    private Dictionary<Type, Action<Base>> dict;

    public Test()
    {
         dict = new Dictionary<Type, Action<Base>>();
    }

    public void Test(Inh inh)
    {
    }

    public void Add<T>(Action<T> callback) 
        where T : BasePackage
    {
        dict.Add(typeof(T), callback);
    }
}

Основная идея заключается в использованиисловарь как функция вызывающей стороны.Например, если бы я добавил функцию Test в качестве функции обратного вызова, я мог бы позже сделать что-то вроде этого:

dict[typeof(Inh)](new Inh());

К сожалению, я не могу сам найти sulution, поэтому я прошу о помощи.Если у кого-то есть какие-либо предложения, это будет оценено.

1 Ответ

4 голосов
/ 08 декабря 2011

Вы можете сделать это, чтобы принудить тип.Обратите внимание, что это может привести к сбою во время выполнения (из-за неправильного приведения), если вы когда-либо посмотрите вверх и вызовете делегата для неправильного типа.Возможный случай сбоя заключается в том, что это не соответствует критериям автоматической контрастности при использовании делегата.

public void Add<T>(Action<T> callback) 
        where T : Base
    {
        dict.Add(typeof(T), Base b => callback((T)b));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...