使用类型T'的变量设置类型T的属性,并在setter中处理转换?

时间:2012-05-14 15:14:16

标签: c# properties type-conversion setter

假设我有一个内部有公共属性的类,如下所示:

class Data
{
    public int Property { get; set; }
}

现在,出于某种原因,我想将字符串传递给此属性。我可以在传递之前将字符串转换为Int32但是更懒惰更容易。是否可以更改设置器以便自动完成转换?如:

if (value is string) Property = Int32.Parse(value);

当然,这个例子不起作用。 VS抛出一个错误加上关于值永远不会是字符串的警告。

编辑:是的,我知道这是一个坏主意。这只是好奇心。

4 个答案:

答案 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值,则必须将其展开(强制转换)。