Переключение на основе общего типа аргумента - PullRequest
0 голосов
/ 03 декабря 2018

В C # 7.1 ниже действительный код:

object o = new object();
switch (o)
{
    case CustomerRequestBase c:
        //do something
        break;
}

Однако я хочу использовать инструкцию переключения шаблонов в следующем сценарии:

public T Process<T>(object message, IMessageFormatter messageFormatter) 
    where T : class, IStandardMessageModel, new()
{
    switch (T)
    {
        case CustomerRequestBase c:
            //do something
            break;
    }
}

Среда IDE дает мнеошибка "'T' является типом, который недопустим в данном контексте". Есть ли элегантный способ включить тип универсального параметра?Я понял, что в моем первом примере вы включаете объект, а во втором я бы хотел включить тип T. Каков наилучший подход для этого?

1 Ответ

0 голосов
/ 03 февраля 2019

Ниже приведены два разных класса, называемые Foo и Bar .Вы можете использовать один экземпляр любого из этих классов в качестве параметра для функции с именем Process .В конце концов, вы можете выполнить сопоставление с образцом, как показано в примере функции.Для примера использования есть функция с именем Test .

public class Foo
{
    public string FooMsg { get; set; }
}

public class Bar
{
    public string BarMsg { get; set; }
}

public class Example
{
    public T Process<T>(T procClass) where T : class
    {
        switch (typeof(T))
        {
            case
                var cls when cls == typeof(Foo):
                {
                    var temp = (Foo)((object)procClass);
                    temp.FooMsg = "This is a Foo!";

                    break;
                }

            case
                var cls when cls == typeof(Bar):
                {
                    var temp = (Bar)((object)procClass);
                    temp.BarMsg = "This is a Bar!";

                    break;
                }
        }

        return
            procClass;
    }

    public void Test(string message)
    {
        Process(new Foo() { FooMsg = message });
        Process(new Bar() { BarMsg = message });
    }
}
...