在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。这样做的最佳方法是什么?
答案 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 });
}
}