是否可以仅在属性的getter或setter上使用过时的属性?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

是否可以仅在属性的getter或setter上使用过时的属性?

我想做这样的事情:

public int Id {
    get { return _id;}
    [Obsolete("Going forward, this property is readonly",true)]
    set { _id = value;}
}

但很明显,这是不可能的。是否有一项工作允许我将该属性应用于setter?

提问于
用户回答回答于

在这种情况下,我们不能使用自动实现的属性,以便能够在构造函数中设置初始值:

class MyClass
{
    [Obsolete("Use the constructor with param myProperty instead")] MyClass() { }
    MyClass(MyProperty m) { this.m_MyProperty = m; }

    public MyType MyProperty
    { 
        get { return this.m_MyProperty; }
        set { this.m_MyProperty = value; }
    }
}

所以实际上我创建了一个readonly属性,其值只能由构造函数设置。任何尝试通过其默认构造函数创建实例并设置其属性将不会产生编译器警告的setter,但实例 - 这在我的情况是好的:

var m = new MyClass();  // here we get warning/error now
m.MyProperty = 

请注意,如果你的属性不需要从外面设置,那么这不起作用。这是在你的新代码中计算其值时:

MyProperty { get { return /* some computation */ } }
用户回答回答于

我认为这是无法完成的,因为出于某种原因,它已被明确禁止使用Obsolete属性。根据属性目标周围定义的规则,似乎没有任何理由认为Obsolete属性在属性get或set访问器上无效。为了将属性应用于属性集访问器,该属性必须适用于方法,参数或返回值目标。如果查看Obsolete属性,可以看到“method”是该属性的有效目标之一。

事实上,你可以使用与使用AttributeUsage属性的Obsolete属性相同的有效目标来定义属性,并且你会发现可以将其应用于属性get或set访问器,而不能应用Obsolete属性。

[AttributeUsage(AttributeTargets.Method)]
class MyMethodAttribute : Attribute { }

class MyClass
{
    private int _Id;

    public int Id
    {
        get { return _Id; }

        [MyMethodAttribute] // this works because "Method" is a valid target for this attribute
        [Obsolete] // this does not work, even though "Method" is a valid target for the Obsolete attribute
        set { _Id = value; }
    }
}

扫码关注云+社区