C#自定义属性参数

9 c# parameter-passing

我从这个链接中看到了这个答案.将参数添加到自定义属性中,如何在自定义属性上添加参数

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

    public MyCustomAttribute(params int[] values) {
       this.Values = values;
    }
}

[MyCustomAttribute(3, 4, 5)]
class MyClass { }
Run Code Online (Sandbox Code Playgroud)

现在我想知道它是不是可以像这样写?

class MyCustomAttribute : Attribute {
    private int[] _values;

    public MyCustomAttribute(params int[] values) {
       _values = values;
    }
}

[MyCustomAttribute(3, 4, 5)]
class MyClass { }
Run Code Online (Sandbox Code Playgroud)

我将属性值更改为变量_values.我也将它设为私有,当我尝试它时它工作正常.

有人可以告诉我为什么接受的答案是有效的吗?

Han*_*Han 9

接受的答案使用公共财产而不是私有字段。公共属性的好处是您可以省略构造函数,并在默认构造函数中提供属性的值。

我将您的第一个代码(具有公共属性的代码)更改为类似的代码。

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }
}

[MyCustomAttribute(Values = new int[] { 3, 4, 5 })]
class MyClass { }
Run Code Online (Sandbox Code Playgroud)


Ral*_*ing 5

由于参数列表未命名,因此使用 的[MyCustomAttribute(3, 4, 5)]构造函数。MyCustomAttribute

因此,是否有公共财产并不重要Values

[MyCustomAttribute(3, 4, 5)]在您的第一个代码示例中,使用和是可以接受的[MyCustom(Values = new[] {3, 4, 5})]

第二个代码示例“仅”接受[MyCustomAttribute(3, 4, 5)].


Lij*_*eph 5

存在差异,而这都是关于reflection

其中最主要的是我们获得的流畅性——我们可以使用构造函数或属性Values

在此输入图像描述

public class MyCustomAttribute : Attribute
{
    public int[] Values { get; set; } = new int[] { 1, 2, 3 };

    public MyCustomAttribute(params int[] values)
    {
        this.Values = values;
    }
}

[MyCustom(1, 2, 3)]
class MyClass
{

}

[MyCustom(Values = new int[] { 1, 2, 3})]
public class MyAnotherClass
{
}
Run Code Online (Sandbox Code Playgroud)

另一个因素是reflection获得财产;当Values字段为 时public,我们可以使用下面的内容来获取详细信息,但不能使用private:

var data = typeof(MyCustomAttribute).GetProperty("Values");
Run Code Online (Sandbox Code Playgroud)