【问题标题】:How to use multi properties in class that contain one variable?如何在包含一个变量的类中使用多个属性?
【发布时间】:2012-07-09 18:19:48
【问题描述】:

我有一个名为“config”的类,它有一个名为“param”的私有字符串变量。

我需要从“config”类中获取“param”变量,有时为 int 类型,有时为 bool 类型或字符串。

据我所知,我需要在配置类中创建 3 个属性,每个属性都必须转换类型,如下所示:

第一个属性将 string 转换为 int,第二个将 string 转换为 bool,第三个属性获取字符串值。

这个类应该是这样的:

class Config
{
    private string param; 

   public int ParamAsInt
  {
    get 
    { 
        return int.Parse(param); 
    }
  }

  public bool ParamAsBool
  {
    get 
    { 
        return bool.Parse(param); 
    }
  }

  public string ParamAsString
  {
    get 
    { 
        return param; 
    }
  }

}

但是我不知道这些属性如何根据我想出类的变量类型来使用。

【问题讨论】:

    标签: c# .net properties enums


    【解决方案1】:

    此代码无法编译 - int 等是保留关键字,不能用作标识符。您可以尝试将您的属性命名为 Int32ValueStringValue 等,或者试试这个:

    public static implicit operator bool (Config config)
    {
        return bool.Parse(config.param);
    }
    
    public static implicit operator int (Config config)
    {
        return int.Parse(config.param);
    }
    

    这将使代码更简洁:

    Config c = GetConfig("foo");
    var isFeatureEnabled = false || c;
    var spacing = 23 + GetConfig("bar");
    

    【讨论】:

    • 至于上述问题,他需要多个我认为 C# 不支持的隐式转换(用户定义转换的评估从不涉及多个用户定义或提升转换运算符。)
    【解决方案2】:

    您忘记提供您的属性名称。您希望如何引用它们?像这样的:

    class Config
    {
        private string param; 
    
        public int ParamAsInt
        {
            get 
            { 
                return int.Parse(param); 
            }
        }
    
        public bool ParamAsBool
        {
            get 
            { 
                return bool.Parse(param); 
            }
        }
    
        public string ParamAsString
        {
            get 
            { 
                return param; 
            }
        }
    }
    

    请注意,我还修复了您对.Parse() 的调用中的大小写。 C# 区分大小写。我还将对bool.TryParse() 的调用替换为bool.Parse()。前者(如果使用正确,这不是因为它缺少参数)只会告诉你它是否 bool,它不会告诉你bool 的值是多少实际上。 (例如,bool.TryParse('false' out someBool) 将返回 true。)

    当然,这段代码有点危险。您需要从一些更具防御性的编程开始来检查这些值。基本上,查找TryParse() 以及如何正确使用它。像这样的东西,例如:

    public int ParamAsInt
    {
        get 
        { 
            var tmp = default(int);
            if (int.TryParse(param, out tmp))
                return tmp;
            else
                // do something else? throw a specific exception? 
        }
    }
    

    另外,这段代码的目的是什么?这似乎是一个非常仓促和糟糕的设计。对于param 的任何给定值(顺便说一句,这怎么可能是set?)这只是随机尝试为其公开类型化的属性。如果您猜对了,那么您仍然会遇到其他会引发异常的人。当然,有一种更简洁的方式来完成你想要做的事情。那么你想做什么?

    【讨论】:

      猜你喜欢
      • 2017-09-02
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      相关资源
      最近更新 更多