繁体   English   中英

.net中的自定义属性和例外

[英]Custom Attributes and Exceptions in .net

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

属性仅在您使用反射时实际构建,因此这是您唯一可以抛出异常的时间。 我不记得曾经使用过属性并让它抛出异常。 属性通常提供数据而不是真实的行为 - 我希望使用该属性的代码提供任何验证。 我知道这不像普通的封装,但它是我的经验中的方式。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM