C# net中的自定义属性和异常

C# net中的自定义属性和异常,c#,.net,exception,attributes,C#,.net,Exception,Attributes,在用C#编写自定义属性时,我想知道是否有关于属性异常的指导原则或最佳实践。 属性是否应检查给定参数的有效性?或者这是财产使用者的任务 在一个简单的测试中,在我对具有异常引发属性的类型使用GetCustomAttributes之前,没有引发异常。 我只是觉得只有在显式请求属性时才从属性中获取异常有点尴尬 例外情况下的示例属性: [AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = false)

在用C#编写自定义属性时,我想知道是否有关于属性异常的指导原则或最佳实践。 属性是否应检查给定参数的有效性?或者这是财产使用者的任务

在一个简单的测试中,在我对具有异常引发属性的类型使用GetCustomAttributes之前,没有引发异常。 我只是觉得只有在显式请求属性时才从属性中获取异常有点尴尬


例外情况下的示例属性:

[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = false)]
sealed public class MyAttribute : Attribute
{
    public string SomeValue { get; private set; }

    public MyAttribute(string someValue)
    {
        if(string.IsNullOrEmpty(someValue))
        {
            throw new ArgumentNullException("path");
        }

        if(!someOtherCheck(someValue))
        {
            throw MyAttributeException("An other error occured");
        }

        SomeValue = someValue;
    }
}

属性实际上只有在使用反射时才被构造,所以这是唯一可以抛出异常的时间。我不记得曾经使用过属性并让它抛出异常。属性通常提供数据而不是真实的行为——我希望代码使用属性来提供任何验证。我知道这和普通的封装不同,但我的经验是这样的

我们的项目中有一些相当复杂的属性,因此我们包括输入的验证。例如,作为I18N和L10N工作的一部分,我们拥有执行资源查找的属性(与框架中用于本地化设计器中属性的类别和描述字符串的属性非常相似)。这些自定义属性必须经过一些验证才能正常工作

我们拥有的简单属性没有使用验证,因为我们希望使用代码失败,从而指示错误的位置


因此,总之,它确实取决于属性的复杂性;如果它是用一种数据实例化的,但预期会提供另一种数据(例如在资源查找中),那么它应该包含验证,否则,它可能不应该包含验证。

除了一些具有编译器特定含义的例外(例如
[PrincipalPermission]
等),属性不能在没有被要求的情况下直接与代码交互。但是,如果使用AOP(面向方面编程)工具“”,则方面属性可以为类添加行为。不简单,但有时这是一个非常有用的技巧