根据通用参数类型切换

时间:2018-12-03 16:25:22

标签: c# generics switch-statement pattern-matching c#-7.1

在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 :(得分:1)

下面是两个不同的类,分别称为 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 });
    }
}