10

在用 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;
    }
}
4

3 回答 3

7

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

于 2008-11-24T17:19:31.327 回答
2

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

于 2008-11-24T20:05:41.663 回答
1

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

我们没有使用验证的简单属性,因为我们宁愿消费代码失败,指示错误的位置。

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

于 2008-11-24T17:53:55.563 回答