【问题标题】:How to return the correct type of an inherited type from a method in C#?如何从 C# 中的方法返回正确类型的继承类型?
【发布时间】:2019-01-21 11:37:02
【问题描述】:

下面是我想要实现的目标。使用代码 sn-p 更容易显示。

abstract class MyBaseType {}

class MyType1: MyBaseType() {}

class MyType2: MyBaseType() {}

class MyType3: MyBaseType() {}

public class Utils()
{
    public XXXX IdentifyCorrectType()
    {
        var identifyingCondition = GetCorrectType();// returns 1,2,3...
        switch(identifyingCondition)
        {
            case 1:
                return typeof(MyType1);break;
            case 2:
                return typeof(MyType2);break;
            case 3:
                return typeof(MyType3);break;
        }
    }
}

IdentifyCorrectType方法声明中的XXXX应该写什么来编译这段代码?返回值在其他地方用于实例化该类型,因此该方法只需要返回正确的类型。

PS:返回所需类的对象(例如new MyType2())而不是类型是不可能的,因为类依赖项并非总是随处可用。

【问题讨论】:

  • 所以你的问题是关于如何使用System.TypeEdit 澄清这一点。
  • 我怀疑这可能是(部分)在使用泛型时尝试避免使用编译时类型指定类型参数的错误方法。它永远不会结束
  • 为什么需要GetCorrectType 来返回一个数字?只从该方法返回Type,而不是使用case 语句返回这个额外的方法不是更简单吗?此外,break; 是多余的,因为您已经在每个 case 中使用了return
  • 这看起来不是很糟糕,而且它肯定不是泛型。好吧,至少三分之一的标签是正确的......
  • 这感觉像是一个 XY 问题 - meta.stackexchange.com/questions/66377/what-is-the-xy-problem为什么你想这样做?退后一步,展示一个更完整的示例,展示您认为这将如何帮助您。换句话说,消费IdentifyCorrectType的代码是什么样的?

标签: c# oop generics


【解决方案1】:

编辑 1: 根据@Cid,根据 cmets 更好的方法应该是:

public MyBaseType IdentifyCorrectType()
    {
        var identifyingCondition = GetCorrectType();// returns 1,2,3...
        switch (identifyingCondition)
        {
            case 1:
                return new MyType1();
            case 2:
                return new MyType2();
            case 3:
                return new MyType3();
            default:
                return null;
        }
    }

你可以使用Type class作为IdentifyCorrectType方法的输出:

public Type IdentifyCorrectType()
{
    var identifyingCondition = GetCorrectType();// returns 1,2,3...
    switch(identifyingCondition)
    {
        case 1:
            return typeof(MyType1);
        case 2:
            return typeof(MyType2);
        case 3:
            return typeof(MyType3);
        default:
            return null;
    }
}

【讨论】:

  • @Cid 就像 PS 中提到的那样,返回 new MyType1() 是不可能的,因为在我试图识别正确类型的时候依赖项还不可用。这是一个使用 MVVM 的 Xamarin.Forms 项目,我需要根据我在特定于平台的代码中检查的某些条件来决定首先显示哪个屏幕。如果返回正确的类型,我可以在使用代码中初始化该对象在 Xamarin.Forms 完成加载并准备好之后
  • @Cid - 你指的是这个吗?
  • @iSahilSharma 是的,但我删除了我的答案,因为这不是 OP 想要的
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多