2010-11-03 51 views
6

眼下,不使用性质的,我有这样的:添加属性到C#属性设置参数

public void SetNumber([Array(new int[]{8})] Byte[] number) 

正如你所看到的,我加入ArrayAttribute属性参数。

我想要做的是相同的,但在属性setter上。这不起作用:

[Array(new int[]{8})] 
public Byte[] SetNumber 
{ 
    set 
    { 
    } 
    get 
    { 
    return null; 
    } 
} 

有属性附加到set_SetNumbervalue方法参数的方法吗?

此外,一个相关的问题。生成的两个方法(get/set)没有自定义属性。任何人都可以向我解释为什么?

回答

7

您需要使用paramattribute targetset

public Byte[] SetNumber { 
    [param: Array(new int[] { 8 })] 
    set { 
    } 
    get { 
    return null; 
    } 
} 

至于第二个问题,自定义属性被设置在属性本身,而不是属性访问器方法。

另外,如果您的ArrayAttribute永远只能适用于参数,它可以被定义如下:

[AttributeUsage(AttributeTargets.Parameter)] 
public class ArrayAttribute : Attribute { 
    // ... 
} 
+2

+1从来不知道。 – SLaks 2010-11-03 19:40:38

+0

谢谢,这解决了我的问题。 – tlg 2010-11-03 20:45:39

0

你不这样做,就像你在第一个例子中所做的那样创建一个方法。你不能通过除了价值以外的任何东西。

public Byte[] TheNumber 
{ 
    private set; 
    get 
    { 
     return null; 
    } 
} 

public void SetNumber([Array(new int[] { 8 })] Byte[] number) 
{ 
    this.TheNumber = number; 
} 
+0

顺便说一句,如果你有一个公开的属性像上面,你就可以使用私有组; – CrazyDart 2010-11-03 19:15:28

+0

看看这个链接http://oreilly.com/catalog/progcsharp/chapter/ch18.html – CrazyDart 2010-11-03 19:27:50

+0

其实,这可能工作。仅仅是一些背景说明,我从XML文件生成这些方法。该属性用于单元测试生成一个适当长度的数组作为参数。 – tlg 2010-11-03 19:31:54

0

我不能肯定,但我的猜测是,你想要什么,你不能做 - 二传手value参数不能暴露你申请的属性。

至于你的第二个问题,一个属性不同于它的getter & setter方法。您可以将一个属性setter方法如下所示:

public Byte[] SetNumber 
{ 
    [Array(new int[]{8})] 
    set 
    { 
    } 
    get 
    { 
    return null; 
    } 
} 
+0

我试过了,但当我尝试在属性的设置方法版本(在调试立即窗口中)调用GetCustomAttribute(true)时,我仍然得到空值。无论如何,我想我现在会放弃这个想法。谢谢。 – tlg 2010-11-03 19:29:58