c# - 基于泛型参数类型的切换
问题描述
在 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 类型。最好的方法是什么?
解决方案
下面是两个不同的类,称为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 });
}
}
推荐阅读
- windows - 如何按顺序/串联运行守夜测试用例?
- php - 使用值范围更新数据库
- android - 在 socket.io 聊天中收到消息时的前台服务问题
- spring - 为什么 SockJS 不兼容?
- go - “使用 Go 语法安全转义”是什么意思?
- python - Visual Studio 2019 中 Python 的语法突出显示/着色不起作用
- reporting-services - SSRS 表达式 - 根据条件求和,如果求和返回 null,则无法使其返回零
- python - 将 DataFrameGroupBy 转换为数据框,以便我可以获取各个列
- java - 发送蓝色:发送带有附件的邮件到 sendinblue
- android - 如何在没有平面的情况下在相对于相机的相对位置创建对象?