我的名为“config”的类具有名为“param”的私有字符串变量。
我需要从“config”类“param”变量获取有时作为int类型有时作为bool类型或字符串。
据我所知,我需要在config类中创建3个属性,每个属性都必须转换类型,如下所示:
第一个属性将字符串转换为int,第二个属性将字符串转换为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;
}
}
}
但我不知道如何根据我想要离开课堂的变量类型来使用这些属性。
答案 0 :(得分:4)
此代码无法编译 - int
,这些是保留关键字,不能用作标识符。您可以尝试将您的属性命名为Int32Value
,StringValue
等,或尝试以下操作:
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");
答案 1 :(得分:1)
您忘记提供属性名称。您期望如何参考它们?像这样:
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
的任何给定值(顺便说一下,甚至设置怎么样?),这只是随机尝试为它公开类型属性。如果您猜对了,那么您仍然会留下其他会抛出异常的人。当然,有一种很多更清洁的方式来完成你想要做的事情。那么你想要做什么 ?