Общий делегат или общая проблема приведения - PullRequest
1 голос
/ 26 февраля 2009

Как мне сделать следующий код скомпилированным?

    Action<MyClass<object, object>> func = x => Console.WriteLine(x.ToString());

    public void Apply<T1, T2>(MyClass<T1, T2> target)
    {
        func.Invoke(target);
    }

Я знаю, что это не работает, потому что MyClass не является MyClass <объект, объект>, но что я могу сделать?

Могу ли я сделать функцию универсальной? или же Могу ли я разыграть цель?

в любом случае, как?

Если это поможет, ничто в func никогда не сделает ничего специфического для T1 или T2. Я знаю, что это предположение может сделать его хрупким, но юнит-тесты должны выявить любые проблемы.

Edit: я избегаю проблемы в настоящее время с множеством пустых интерфейсов, с которыми я бы лучше покончил!

Спасибо

Ответы [ 2 ]

10 голосов
/ 26 февраля 2009

Ну, один из вариантов - написать универсальный метод для возврата правильного типа функции:

public void Apply<T1, T2>(MyClass<T1, T2> target)
{
    GetFunc<T1,T2>().Invoke(target);
}

private Action<MyClass<T1,T2>> GetFunc()
{
    return x => Console.WriteLine(x.ToString());
}

В качестве альтернативы, если вы действительно хотите иметь возможность объявить действие «Я могу работать с любым MyClass», я предлагаю вам создать неуниверсальный тип MyClass и сделать из него MyClass<T1,T2>: 1007 *

public class MyClass
{
    // Put common stuff in here
}

public class MyClass<T1, T2> : MyClass
{
    // Put stuff using T1 and T2 here
}

Тогда вы можете просто использовать Action<MyClass>.

0 голосов
/ 26 февраля 2009

В конкретном случае, о котором вы упомянули, вам просто нужно изменить Action> на Action, потому что вы не используете какие-либо методы, относящиеся к 'MyClass'.

Если вы хотите использовать методы, специфичные для «MyClass», которые не зависят от универсальных типов, то вам следует определить базовый класс, содержащий эти методы, извлечь из него MyClass и использовать базовый тип в качестве типа аргумента для делегат.

Если вы хотите использовать методы, специфичные для «MyClass», которые зависят от универсальных типов, то вам следует создать делегата с правильными типами во время вызова.

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