Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用类型为T';的变量设置类型为T的属性;,以及在setter中处理转换?_C#_Properties_Type Conversion_Setter - Fatal编程技术网

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-他从来没有说过你说这是个好主意。他只是想给你额外的信息。好吧,谢谢。如果可能的话,我会很惊讶的。