c#-从属性构造函数引发异常

c#-从属性构造函数引发异常,c#,exception,custom-attributes,C#,Exception,Custom Attributes,我找到了这个主题,并尝试了以下方法: public class FailerAttr : Attribute { public FailerAttr(string s) { throw new Exception("I should definitely fail!"); } } using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public class Test { [Te

我找到了这个主题,并尝试了以下方法:

public class FailerAttr : Attribute {
    public FailerAttr(string s) {
        throw new Exception("I should definitely fail!");
    }
}
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class Test {
    [TestMethod]
    public void GoFail() {
        // Make sure attribute will get initialized
        new Failer();
    }

    private class Failer {
        [FailerAttr("")]
        public int Prop { get; set; }
    }
}
在单元测试项目中,我有以下几点:

public class FailerAttr : Attribute {
    public FailerAttr(string s) {
        throw new Exception("I should definitely fail!");
    }
}
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class Test {
    [TestMethod]
    public void GoFail() {
        // Make sure attribute will get initialized
        new Failer();
    }

    private class Failer {
        [FailerAttr("")]
        public int Prop { get; set; }
    }
}
当我运行测试时,它成功了。因此,问题是:

  • 为什么它没有失败
  • 从属性抛出异常真的是个坏主意吗?因为我想我需要
  • 一些环境信息(以防万一):

    • 单元测试通过ReSharper的单元测试运行程序(R#v8.2.0.2160)运行
    • Visual studio v11.0.61030.0

    属性不会转换为可执行代码,而是转换为元数据

    这样的元数据在正常执行期间不会使用,只有当您开始使用元数据(如通过反射)时,属性类型才会重新发挥作用

    编译期间不会执行构造函数或属性中的任何代码。相反,构造函数的类型和参数被序列化到元数据中,只有在使用反射进行检查时,构造函数才会实际执行

    换句话说,如果您打算在编译时失败,那么就不能


    尝试使用反射查找属性,这取决于从元数据反序列化的属性对象,构造函数可能会被调用,也可能不会被调用,但仅通过将其应用于标识符肯定不会被调用。

    因为属性是运行时可用的类定义的一部分(也称为“元数据”)在geekspeak中,CLR不会实例化它们,除非程序的某些部分要求它们。这是有道理的:为什么要费心把CPU周期花在没人想访问的东西上

    因此,除非您请求该属性,否则构造函数的执行永远不会发生

    下面是一种请求属性的方法,该属性会导致程序失败:

    var attr = Attribute.GetCustomAttribute(typeof(Failer).GetProperty("Prop"), typeof(FailerAttr));
    
    此代码使CLR实例化触发异常的
    faileratr

    如果不知道属性的类型,可以通过此调用一次检索所有属性:

    var allAttributes = Attribute.GetCustomAttributes(typeof(Failer).GetProperty("Prop"));
    

    这也会导致异常()。

    您可以使用反射获取属性吗?@KarelFrajtak我不确定,我还没有尝试过。将在几分钟后重试您的注释
    //确保属性将被初始化
    为false。只有在检查属性时(通常通过反射)才会构造它。@Bun是的,你说得对。我想我没有很好地理解属性的概念。当通过反射获取属性时,构造函数代码是否运行(或是否取决于),例如使用
    typeof(Failer).GetProperty(“Prop”).GetCustomAttributes()
    或类似工具?它是在使用该反射时执行的,但不是在编译时。将此标记为关于如何实现失败的代码示例的答案。谢谢!不太相关,但如果您以.NET 4.5或更高版本为目标,则有一些通用扩展方法(需要使用System.Reflection;
    ),因此您可以说
    typeof(Failer).GetProperty(“Prop”).GetCustomAttribute()
    (单个或空)或
    typeof(Failer).GetProperty(“Prop”).GetCustomAttributes()
    (所有发生的情况,可能为空)@JeppeStigNielsen我们将迁移到4.5.1,为此,我在4.0上使用自己的扩展方法。谢谢你的建议,我不知道