我可以对这样的代码使用模式匹配吗(在泛型类型上) [英] Can I use pattern matching for code like this (on generic types)

查看:63
本文介绍了我可以对这样的代码使用模式匹配吗(在泛型类型上)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望使用模式匹配替换方法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#还不能(建议herehere)。

但确实存在黑客攻击,如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语句序列有所改进。

这篇关于我可以对这样的代码使用模式匹配吗(在泛型类型上)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆