是否可以在 c# 中创建具有“隐藏”属性的自定义属性

本文关键字:隐藏 属性 自定义属性 创建 是否 | 更新日期: 2023-09-27 18:36:31

>通常,当您创建自定义属性类时,任何具有 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
{
};

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

是否可以在 c# 中创建具有“隐藏”属性的自定义属性

如果您

打算在代码中的其他地方使用它,但不希望其他人看到它,您可以简单地将属性(或只是属性 setter)internal

或者,如果要公开其他用户的属性,但只是禁止在声明性语法中设置它,则无法公开属性 setter,但如果需要,请提供不同的方法来设置值:

class MyCustomAttribute : Attribute
{
    public bool MyProperty
    {
        get { /* do something */ }
    }
    public void SetMyProperty(bool value)
    {
        /* do something */
    }
}

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

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