0

通常,当您创建自定义 Attribute 类时,任何具有 getter 和 setter 的公共属性都会自动公开给在该类上应用该属性的人,以便使用该属性的人可以指定该属性的值。

我想要一个自定义属性类,它公开特定属性的 getter 和 setter,但不允许在创建时将此属性指定为属性的命名参数。例子:

[AttributeUsage(AttributeTargets.Class)]
class MyCustomAttribute : Attribute
{
    public bool MyProperty
    {
        get { /* do something */ }
        set { /* do something */ }
    }
}


// The following line should be a compiler error, MyProperty should
// be hidden for attribute initialization!
[MyCustomAttribute(MyProperty=true)]
class MyClass
{
};

有什么办法可以做到这一点?

4

2 回答 2

2

internal如果您打算在代码中的其他地方使用它,但不希望其他人看到它,您可以简单地创建属性(或只是属性设置器) 。

或者,如果您想向其他用户公开属性,但只是不允许在声明性语法中设置它,则不能公开属性设置器,但如果需要,请提供不同的方法来设置值:

class MyCustomAttribute : Attribute
{
    public bool MyProperty
    {
        get { /* do something */ }
    }

    public void SetMyProperty(bool value)
    {
        /* do something */
    }
}
于 2013-10-22T22:48:22.010 回答
1

如果属性是公共的,则无法阻止在应用属性时分配它。正如评论中 dtb 所建议的那样,您可以改用 getter 和 setter 方法,但这可能对您没有帮助......

属性不会在运行时被修改。当您使用反射从类或成员(或其他任何东西)中检索属性时,您只会获得这些属性的副本,因此即使您修改了它们,下次您检索它们时,您也会获得一个全新的、未修改的副本。

于 2013-10-22T22:49:14.087 回答