【问题标题】:Is it possible for a public-facing property to return either a string OR a numeric w/o using 'Object'?面向公众的属性是否可以使用“对象”返回字符串或不带数字的数字?
【发布时间】:2010-11-04 18:15:45
【问题描述】:

所以我遇到了这样一种情况,我有一个可以存储字符串或数值的类,并且我希望单个属性返回一个或另一个(设置两者都会失败)。我正在使用自定义泛型类来处理数字(因此我可以使用有符号、无符号和可空值),并将字符串存储在单独的变量中。

理论上,如果可以根据返回类型进行重载,我可以很容易地做到这一点。但是.NET 目前不允许这样做。所以我想知道是否还有其他一些非常遥远的技巧(通过 Reflection.Emit 生成 MSIL 之外)可以完成同样的事情。

我对委托、指针解引用、泛型、神秘仪式等的想法持开放态度。我也对作为学习工具的任何想法或优点/缺点感兴趣。如果使用标准 Object 是实现我想要的唯一方法,那么这对我来说很好。但是在 Google 上很难找到正确的关键字集来寻找这种能力,所以我想在我继续做这个项目的其他事情之前先在这里问一下。

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    对于一个简单的属性,我看不出使用 Object 以外的任何东西会如何工作。想象一下你是调用者——你希望声明的属性类型是什么?您会尝试将表达式分配给什么类型的值?

    如果您真的必须拥有一个可以返回各种不同类型的属性,Object 听起来不错。

    【讨论】:

    • 是的,我认为这是我唯一理智的选择。我认为,凭借 .NET 的所有奇思妙想,编译器使用此类属性并能够知道正在调用哪个特定的重载属性不会超出可能性范围。我仍在学习特定 .NET 功能的各种名称/关键字,所以我要确保我没有遗漏任何东西。
    【解决方案2】:

    您可以将公共属性作为字符串,也可以在将其转换为字符串后返回数字。

    public string YourProperty
    {
        get { 
              if(somecondition)
                    return "some string";
              else if(someothercondition)
                    return 1234.ToString();
            }
    }
    

    在访问您的财产时,您可以使用 Convert.ToInt32()。 示例:

    public void YourMethod()
    {
        int a;
        string str;
        bool isNumber;
        try
        {
          a = Convert.ToInt32(obj.YourProperty);
          isNumber = true;
        }
        catch(FormatException e)
        {
          str = obj.YourProperty;
          isNumber = false;
        }
    }
    

    虽然这不是一种好的编程方式,但您将实现对字符串和数字仅使用一个属性的目标。

    【讨论】:

    • 是的,但这仅适用于吸气剂。设置将要求我检查字符串中数字的范围,以确保它适合数据类型。从技术上讲,我和一个对象在同一条船上。如果属性可以以某种形式或方式支持多种返回类型,或者允许基于返回类型的重载,那就更简洁了。甚至允许通用属性,这应该创建足够独特的签名。
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2019-05-18
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多