假设我有一个内部有公共属性的类,如下所示:
class Data
{
public int Property { get; set; }
}
现在,出于某种原因,我想将字符串传递给此属性。我可以在传递之前将字符串转换为Int32
但是更懒惰更容易。是否可以更改设置器以便自动完成转换?如:
if (value is string) Property = Int32.Parse(value);
当然,这个例子不起作用。 VS抛出一个错误加上关于值永远不会是字符串的警告。
编辑:是的,我知道这是一个坏主意。这只是好奇心。答案 0 :(得分:3)
如果您想避免转换,可以创建setter方法,而不是使用属性setter:
void SetProperty(int value);
void SetProperty(String value);
等等。
如果确实想要狂野,您可以创建一个PropertyValue
类型,其中包含来自整数,字符串和您想要的任何类型的隐式转换,并将其用作属性类型。这将使得setter的行为与您想要的一样,但是您将遇到getter的问题。如果您确实想保存这些转换,请使用第一个解决方案。
答案 1 :(得分:3)
无法以这种方式更改设定器。 C#中的属性的setter必须与属性本身具有相同的类型。作为setter的函数,无法从任何其他类型插入静态转换。
答案 2 :(得分:2)
不,根据语言规范,如果您将属性声明为某种类型T
,则value
将保证为T
(或其派生类型之一或类型在编译时实现接口T
。
如果您希望自己的setter接收任何类型的值,请使用object
:
private int prop;
public object Property
{
get { return this.prop; }
set
{
this.prop = value != null ? Int32.Parse(value.ToString()) : 0;
}
}
答案 3 :(得分:0)
您可以使用object
类型的属性:
class Data {
private int _property;
public object Property {
get {
return _property;
}
set {
if (value is string) {
_property = Int32.Parse(value);
} else {
_property = (int)value;
}
}
}
}
但这不太实用。当您向int
分配属性时,它将在object
中明确地加框,然后取消装箱。当您获得值时,getter会返回int
中的object
框,因此如果您希望将其作为int
值,则必须将其展开(强制转换)。