2013-07-25 39 views
1

我创建的简单类具有AttributeUsage属性。当我试图建立我得到的错误:为具有特定签名的方法创建自定义属性

Attribute 'AttributeUsage' is only valid on classes derived from System.Attribute

然后我让我的类继承自Attribute并且一切都很好。

如果我使用AttributeUsage属性,那么它迫使我继承Attribute类。我的问题是我可以使属性强制方法具有特定的签名?

感谢您的帮助!

回答

0

如果我理解正确:您正在寻找的是一个通过您的属性控制编译的工具。您可以检查stylecop或fxcop是否符合您的需求。或者,您可以扩展Visual Studio以访问源代码模型。扩展程序可能会检查源代码(请参阅http://blogs.msdn.com/b/sqlserverstorageengine/archive/2007/03/02/using-visual-studio-s-code-model-objects-for-code-base-understanding.aspx),评估属性并生成编译器警告,无论您喜欢什么错误。

===================================

原来的答案:

答:你只需要提供相应的构造

[AttributeUsage(AttributeTargets.All)] 
public class HelpAttribute : System.Attribute 
{ 
    // Required parameter 
    public HelpAttribute(string url) 
    { 
     this.Url = url; 
    } 

    // Optional parameter 
    public string Topic { get; set; } 

    public readonly string Url; 


} 

public class Whatever 
{ 
    [Help("http://www.stackoverflow.com")] 
    public int ID { get; set; } 

    [Help("http://www.stackoverflow.com", Topic="MyTopic")] 
    public int Wew { get; set; } 

    // [Help] // without parameters does not compile 
    public int Wow { get; set; } 
} 

允许的参数类型清单当然在MSDN:http://msdn.microsoft.com/en-us/library/aa664615(v=vs.71).aspx

延伸阅读:http://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx

+0

对不起,我的英文不好。在我想问的问题是:当我做属性时,该属性必须强制方法具有特定的签名。我并不担心属性的构造函数(签名)。在你给我的例子中:string url是一个必需的参数,Topic是命名参数。这里是例子:当我在我的方法上使用Help属性时,那个Help属性必须强制方法有string和int参数。 – Dilshod

+0

让我试着重写你的问题:是否可以编写一个属性来控制方法的签名? – Fried

+0

听起来不错。 – Dilshod