首页 > 解决方案 > 基于泛型参数类型的切换

问题描述

在 C# 7.1 中,以下是有效代码:

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

但是,我想在以下场景中使用模式 switch 语句:

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

IDE 给我错误“'T' 是一种类型,在给定的上下文中无效”是否有一种优雅的方式来打开泛型参数的类型?在我的第一个示例中,您正在打开对象,而第二个示例中我想打开 T 类型。最好的方法是什么?

标签: c#genericsswitch-statementpattern-matchingc#-7.1

解决方案


下面是两个不同的类,称为FooBar。您可以将这些类中的任何一个实例用作名为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 });
    }
}

推荐阅读