【问题标题】:Custom Attributes and Exceptions in .net.net 中的自定义属性和异常
【发布时间】:2008-11-24 17:00:49
【问题描述】:

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

【问题讨论】:

    标签: c# .net exception attributes


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2016-01-07
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多