0

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

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

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

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

当然,这个例子是行不通的。VS 抛出一个错误以及一个关于 value 永远不会是字符串的警告。

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

4

4 回答 4

3

如果您想避免转换,您可以创建 setter 方法,而不是使用属性 setter:

void SetProperty(int value);
void SetProperty(String value);

等等。

如果你真的想疯狂,你可以创建一个PropertyValue从整数、字符串和任何你想要的类型进行隐式转换的类型,并将其用作属性类型。它会让 setter 表现得像你想要的那样,但是你会遇到 getter 的问题。如果您真的想保存这些转换,请使用第一个解决方案。

于 2012-05-14T15:17:16.360 回答
3

无法以这种方式更改设置器。C# 中属性的 setter 必须与属性本身具有相同的类型。作为 setter 的函数,无法插入来自任何其他类型的静态转换。

于 2012-05-14T15:18:07.537 回答
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;
    }
}
于 2012-05-14T15:22:32.090 回答
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;
      }
    }
  }
}

不过,这不是很实用。当您将 anint分配给该属性时,它将被隐式地装箱object,然后取消装箱。当您获得值时,getter 会返回int装箱的 an object,因此如果您希望将其作为int值,则必须将其拆箱(强制转换)。

于 2012-05-14T15:21:00.793 回答