C#自定义属性参数

C#自定义属性参数,c#,parameter-passing,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 { } 现在

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

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

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

[MyCustomAttribute(3, 4, 5)]
class MyClass { }
现在我在想,难道不能这样写吗

class MyCustomAttribute : Attribute {
    private int[] _values;

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

[MyCustomAttribute(3, 4, 5)]
class MyClass { }
我将属性值更改为变量_Values。 我还把它做成了私人的,我试着用的时候效果很好


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

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

因此,如果存在公共
属性,则无所谓

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


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

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

我将您的第一个代码,即具有公共属性的代码,更改为类似这样的代码

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

[MyCustomAttribute(Values = new int[] { 3, 4, 5 })]
class MyClass { }

两者之间存在差异,这都是关于
反射的

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

另一个因素是
反射
以获得属性;由于
字段为
公共
,我们可以使用以下内容获取详细信息,但不能使用
私有

var data = typeof(MyCustomAttribute).GetProperty("Values");

你的意思是“我的代码或第二个代码”也是正确和可接受的吗?你的两个代码都是可接受的。请参阅本文中的MSDN示例。它类似于您的第二个代码。关于您的第一个代码的变体,请参见我的答案。@RenanteAbril-我已经补充了一点,即两个示例都是正确的。唯一的区别是整数数组是如何提供的(通过构造函数或属性设置器)。“有人能告诉我为什么接受的答案是有效的吗?”--您没有发布任何提示它是无效的。充其量,你已经证明了不止一种方法是有效的。那么,为什么你认为你读到的答案有什么问题呢?问问自己,你可以用你的自定义属性做些什么。提示:属性的主要用途不是被JU实例化。如何从模型或控制器或该视图传递此3,4,5值?我的意思是,有没有办法从类“MyClass”之外传递值?
var data = typeof(MyCustomAttribute).GetProperty("Values");