【问题标题】:CustomAttributeFormatException: Binary format of the specified custom attribute was invalidCustomAttributeFormatException:指定自定义属性的二进制格式无效
【发布时间】:2020-07-14 17:55:04
【问题描述】:

我们发现了一些与自定义属性相关的奇怪行为。

给定这个属性:

public class MyAttribute : Attribute
{
    public MyAttribute(bool b = false, params int[] a)
    {
    }
}

还有这个用法:

class Program
{
    [MyAttribute]
    static void Main()
    {
        Console.ReadKey();
    }
}

我们得到了异常:

System.Reflection.CustomAttributeFormatException:指定自定义属性的二进制格式无效。

为什么会这样?

【问题讨论】:

    标签: .net parameters attributes


    【解决方案1】:

    不确定到底是什么原因;在我自己的测试中,它似乎与在构造函数定义中具有一个或多个默认参数和“params”参数的组合有关。但是,如果它阻碍了你,有一个懒惰的解决方法:

    public class MyAttribute : Attribute
    {
        public MyAttribute(params int[] a) : this(false) {}
    
        public MyAttribute(bool b, params int[] a)
        {
        }
    }
    

    具有非默认值的“params”参数和单独的“params”参数看起来都很好。

    不完全是解释,但是呃...

    【讨论】:

    • 我也无法完全解释它,但这与框架在运行时调用构造函数的方式有关(它们必须对表达式或反射做一些事情,从而混淆哪些参数在参数数组)。真的,应该有一个关于它的编译错误。既然我遇到了这个问题,我的方法是根本不在属性构造函数上使用参数数组。当您指定一个非默认参数然后得到一个运行时错误时,遇到这个问题太令人困惑了,而这个错误几乎没有说明什么是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多