首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#10 --使用T类型在泛型方法中切换

C#10 --使用T类型在泛型方法中切换
EN

Stack Overflow用户
提问于 2021-11-09 21:49:21
回答 2查看 1.2K关注 0票数 0

关于如何在旧版本的C#中打开类型,有很多答案。我的问题与如何打开泛型方法中调用的类型有关:

代码语言:javascript
运行
复制
    public T GetAxis<T>(object axisObject)
    {
        switch (typeof(T))
        {
            case Axis:
                //...do something
                break;
        }

        return null;
    }

我在线路上有个错误:

代码语言:javascript
运行
复制
case Axis axis:

错误是:

类型'System.Type‘的表达式不能由'MyNamespace.Axis’类型的模式处理。

我相信我的问题是如何在<>规范中调用Type,这样我就可以打开它。

EN

回答 2

Stack Overflow用户

发布于 2021-11-09 22:15:59

较新版本的C#没有特别增加任何关于打开Type值的特性。如果您真的试图基于泛型类型进行切换,那么您可能希望遵循其他SO帖子中推荐的模式。

但是,可能有比使用泛型类型更好的方法。您试图对该类型进行switch这一事实意味着,在调用方法时,您希望代码使用的类型有限。在这种情况下,您最好为每种类型显式地使用不同的方法。

而不是:

代码语言:javascript
运行
复制
var axis = GetAxis<Axis>(axisObject);
var somethingElse = GetAxis<SomethingElse>(axisObject);

使用:

代码语言:javascript
运行
复制
var axis = GetAxis(axisObject);
var somethingElse = GetSomethingElse(axisObject);

您的示例似乎没有这样做,但是如果您真正想关闭的是传入对象的类型,那么较新版本的C#确实通过模式匹配提供了一些更好的选项。例如:

代码语言:javascript
运行
复制
public T GetAxis<T>(object axisObject)
{
    switch (axisObject)
    {
        case Axis axis:
            //...do something with `axis`
            break;
        case SomethingElse somethingElse:
            //...do something with `somethingElse`
            break;
    }

    return default;
}

在最后一个例子中,我不清楚T泛型类型有什么价值:您可以用非泛型返回类型替换它。

票数 1
EN

Stack Overflow用户

发布于 2021-11-15 02:09:55

在处理这类事情时,我倾向于求助于以下字典:

代码语言:javascript
运行
复制
private Dictionary<Type, Delegate> _axisCases = new Dictionary<Type, Delegate>();

您可以围绕它编写这样的代码:

代码语言:javascript
运行
复制
public class MyCode
{
    public MyCode()
    {
        this.SetCase<Axis>(o => new Axis());
    }
    
    private Dictionary<Type, Delegate> _axisCases = new Dictionary<Type, Delegate>();

    private void SetCase<T>(Func<object, T> func)
    {
        _axisCases[typeof(T)] = func;
    }

    public T GetAxis<T>(object axisObject) where T : class
    {
        var t = typeof(T);
        if (_axisCases.ContainsKey(t))
        {
            var func = (Func<object, T>)_axisCases[t];
            return func(axisObject);
        }
        return null;
    }
}

现在你可以这样称呼它:

代码语言:javascript
运行
复制
var myCode = new MyCode();
var axis = myCode.GetAxis<Axis>(new object());

这种类型的代码最灵活。但如果你想要更接近正常的案例陈述

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69905550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档