C# 使用类型为T';的变量设置类型为T的属性;,以及在setter中处理转换?
假设我有一个类,里面有一个公共属性,如下所示:C# 使用类型为T';的变量设置类型为T的属性;,以及在setter中处理转换?,c#,properties,type-conversion,setter,C#,Properties,Type Conversion,Setter,假设我有一个类,里面有一个公共属性,如下所示: class Data { public int Property { get; set; } } 现在,出于某种原因,我想向这个属性传递一个字符串。我可以在传递字符串之前将其转换为Int32,但是懒惰更容易。是否可以更改设置器,以便自动完成转换?例如: if (value is string) Property = Int32.Parse(value); 当然,这个例子不起作用。VS会抛出一个错误,并警告值永远不会是字符串 编辑:是的,
class Data
{
public int Property { get; set; }
}
现在,出于某种原因,我想向这个属性传递一个字符串。我可以在传递字符串之前将其转换为Int32
,但是懒惰更容易。是否可以更改设置器,以便自动完成转换?例如:
if (value is string) Property = Int32.Parse(value);
当然,这个例子不起作用。VS会抛出一个错误,并警告值永远不会是字符串
编辑:是的,我知道这是个坏主意。这只是好奇而已。如果要避免转换,可以创建setter方法,而不是使用属性setter:
void SetProperty(int value);
void SetProperty(String value);
等等
如果你真的想去野生,你可以创建一个
PropertyValue
类型,从int、string和任何你想要的类型进行隐式转换,并使用它作为属性类型。这会让二传手表现得像你想要的那样,但你会对接球手产生问题。如果确实要保存这些转换,请使用第一种解决方案。无法以这种方式更改setter。C#中属性的setter必须与属性本身具有相同的类型。无法将任何其他类型的静态转换作为setter的函数插入 您可以使用对象类型的属性
:
class Data {
private int _property;
public object Property {
get {
return _property;
}
set {
if (value is string) {
_property = Int32.Parse(value);
} else {
_property = (int)value;
}
}
}
}
private int prop;
public object Property
{
get { return this.prop; }
set
{
this.prop = value != null ? Int32.Parse(value.ToString()) : 0;
}
}
不过,这并不太实际。将
int
赋值给属性时,它将被不正确地装箱到对象中,然后解除装箱。当您获得值时,getter返回一个对象中的int
,因此如果您希望它作为int
值,则必须将其取消装箱(强制转换)。否,根据语言规范,如果您将属性声明为某种类型T
,则值
将被保证为T
(或其派生类型之一,或实现接口T
的类型)在编译时
如果希望setter接收任何类型的值,请使用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;
}
}
}
}
private int prop;
public object Property
{
get { return this.prop; }
set
{
this.prop = value != null ? Int32.Parse(value.ToString()) : 0;
}
}
不,这是不可能的。这也不是一个好主意。我从来没有说过这是一个好主意,这纯粹是好奇。为了确保我理解你的问题,你意识到值
在setter中永远只会是int
,但你希望能够将任何值传递给数据.Property
,然后处理转换事实而非先验?你是想用对象
?@pikzen-他从来没有说过你说这是个好主意。他只是想给你额外的信息。好吧,谢谢。如果可能的话,我会很惊讶的。