首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以用数组或其他可变数量的参数初始化C#属性吗?

我可以用数组或其他可变数量的参数初始化C#属性吗?
EN

Stack Overflow用户
提问于 2008-11-06 20:42:38
回答 6查看 88.6K关注 0票数 114

是否可以创建一个可以使用可变数量的参数进行初始化的属性?

例如:

代码语言:javascript
复制
[MyCustomAttribute(new int[3,4,5])]  // this doesn't work
public MyClass ...
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-11-06 20:51:14

属性将接受一个数组。但是如果你控制了这个属性,你也可以使用params (这对消费者更好,IMO):

代码语言:javascript
复制
class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

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

[MyCustomAttribute(3, 4, 5)]
class MyClass { }

您创建数组的语法恰好是关闭的:

代码语言:javascript
复制
class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

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

[MyCustomAttribute(new int[] { 3, 4, 5 })]
class MyClass { }
票数 191
EN

Stack Overflow用户

发布于 2008-11-06 21:50:22

您可以这样做,但它不符合CLS:

代码语言:javascript
复制
[assembly: CLSCompliant(true)]

class Foo : Attribute
{
    public Foo(string[] vals) { }
}
[Foo(new string[] {"abc","def"})]
static void Bar() {}

显示:

代码语言:javascript
复制
Warning 1   Arrays as attribute arguments is not CLS-compliant

对于常规的反射用法,最好有多个属性,即

代码语言:javascript
复制
[Foo("abc"), Foo("def")]

但是,这不适用于TypeDescriptor/PropertyDescriptor,因为它只支持任何属性的单个实例(第一个或最后一个获胜,我记不清是哪一个)。

票数 40
EN

Stack Overflow用户

发布于 2008-11-06 20:49:50

尝试像这样声明构造函数:

代码语言:javascript
复制
public class MyCustomAttribute : Attribute
{
    public MyCustomAttribute(params int[] t)
    {
    }
}

然后你可以像这样使用它:

[MyCustomAttribute(3, 4, 5)]

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/270187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档