让setter设置不同于属性类型的类型是正确的吗?

时间:2011-10-29 00:15:13

标签: c#

e.g。

    [XmlAttribute("Type")]
    public string DataTypeString
    {
        get 
        {
            return _dataType.ToString();
        }
        set 
        { 
            _dataType = Type.GetType(value); 
        }
    }

    private Type _dataType;

    public Type DataType
    {
        get { return _dataType; }
        set { _dataType = value; }
    }

在上面的代码中,第一个属性类型是字符串,但是setter设置,_dataType是System.Type

4 个答案:

答案 0 :(得分:3)

你可以并且通常有益于获得属性。

设置属性中的类型转换可能更具反对性。通常期望属性是轻量级的,而不是抛出异常,通常x.YYY=newValue;期望导致x.YYY==newValue为真 - 如果发生类型转换,这些可能很难实现。

即。在你的特定例子中允许按字符串设置类型属性感觉是一个坏主意 - x.DataTypeString="42";的预期行为是什么?您可能需要考虑其他一些方法来启用属性的XML序列化...

答案 1 :(得分:0)

当然可以。这是属性的目的。该物业的使用者无需知道其背后的含义。他/她只是设置或获取一个字符串,这就是他们需要知道的全部内容。

答案 2 :(得分:0)

我猜它没关系,但我更愿意这样做,这不那么奇怪而且不那么冗长:

    public void SetDataType(string value) {
        _dataType = Type.GetType(value); 
    }

    public void SetDataType(Type value) {
        _dataType = value; 
    }

    public Type DataType { get; private set; }  

如前所述,为同一个私有变量设置两个getter / setter对似乎很奇怪。

答案 3 :(得分:0)

如果不知道这门课的目的,很难说。但总的来说,我认为我会因为两个属性具有相同的支持字段而感到困惑(因此更改一个属性会影响另一个)。

但也有例外。例如,在Circle类中,我发现同时具有Radius属性和Diameter属性是完全合理的。所以,这又取决于你班级的目的。

此外,在您提供的示例中,DataTypeString属性似乎没有提供太多好处。如果删除它,呼叫者只需调用

即可达到同样的效果
foo.DataType = Type.GetType("System.Int32");

string dataTypeString = foo.DataType.ToString()