您可以在c#中使用“隐藏”属性创建自定义属性吗?

时间:2013-10-22 22:42:19

标签: c#

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

我想要一个自定义属性类,它为特定属性公开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
{
};

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

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

或者,如果要向其他用户公开属性,但不允许在声明性语法中设置它,则无法公开属性设置器,但如果需要,则提供另一种设置值的方法:

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

    public void SetMyProperty(bool value)
    {
        /* do something */
    }
}

答案 1 :(得分:1)

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

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