Can I use pattern matching for code like this (on generic types)(我可以对这样的代码使用模式匹配吗(在泛型类型上))
本文介绍了我可以对这样的代码使用模式匹配吗(在泛型类型上)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望使用模式匹配替换方法Select<T>()中的多个if语句,如下所示。我要在typeof(T)上使用switch()语句。
static class Program
{
static void Main(string[] args)
{
var doc = new Document();
IWire select = doc.Select<IWire>();
}
public static T Select<T>(this Document document) where T : class, IGeneric
{
var t = typeof(T);
if (t.IsAssignableTo(typeof(IWire)))
{
return document.SelectEntity(EntityType.Wire) as T;
}
if (t.IsAssignableTo(typeof(ISolid)))
{
return document.SelectEntity(EntityType.Solid) as T;
}
if (t.IsAssignableTo(typeof(ISurface)))
{
return document.SelectEntity(EntityType.Surface) as T;
}
// imagine a lot of if statements here
return null;
}
}
public enum EntityType
{
Wire,
Surface,
Solid
}
public interface IGeneric
{
}
public interface IWire : IGeneric
{
}
public interface ISurface : IGeneric
{
}
public interface ISolid : IGeneric
{
}
public class Document
{
public IGeneric SelectEntity(EntityType entity)
{
throw new NotImplementedException();
}
}
我看到的所有示例都在switch(thing)语句中使用实例,如下所示的代码显然是错误的
switch(typeof(T))
{
case // what here?
}
推荐答案
所以根据评论得到的答案是C#还不能(建议here和here)。
但确实存在黑客攻击,如https://stackoverflow.com/a/46769048/380384中所示,尽管不是完全相同的副本。
我可以使用的解决方案如下(感谢@dbc为我指明了正确的方向)。
public static T Select<T>(this Document document) where T : class, IGeneric
{
var t = typeof(T);
switch (true)
{
case var _ when t.IsAssignableFrom(typeof(IWire)):
return document.SelectEntity(EntityType.Wire) as T;
case var _ when t.IsAssignableFrom(typeof(ISurface)):
return document.SelectEntity(EntityType.Surface) as T;
case var _ when t.IsAssignableFrom(typeof(ISolid)):
return document.SelectEntity(EntityType.Solid) as T;
default:
return null;
}
}
但就可读性和设计意图而言,它可能真的比if语句序列有所改进。
这篇关于我可以对这样的代码使用模式匹配吗(在泛型类型上)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:我可以对这样的代码使用模式匹配吗(在泛型类型上)
基础教程推荐
猜你喜欢
- 将数据集转换为列表 2022-01-01
- SonarQube C# 分析失败“不是指针的有效行偏移" 2022-01-01
- 如果条件可以为空 2022-01-01
- 从 C# 控制相机设备 2022-01-01
- 更新 Visual Studio 中的 DataSet 结构以匹配新的 SQL 数据库结构 2022-01-01
- 获取C#保存对话框的文件路径 2022-01-01
- Mono https webrequest 失败并显示“身份验证或解密失败" 2022-01-01
- 在 VB6 或经典 ASP 中使用 .NET 2022-01-01
- 重新排序 WPF TabControl 中的选项卡 2022-01-01
- C# 9 新特性——record的相关总结 2023-04-03
