首页 > 解决方案 > 为什么使用 params 的 C# Attribute 不适用于我的类但适用于字符串?

问题描述

我有一个params在构造函数中使用的属性,我想在参数中将一个类传递给它。

public class FooAttribute: SomeAttribute
{
    public FooAttribute(params Foo[] foo)
    {
        // some code
    }
}

public abstract class Foo
{
    public Foo(int @int, string name)
    {
        // code
    }

    // more code     
}

这不起作用,当使用属性时

[AuthorizeFeature(FooHelper.X, FooHelper.Y)]

(是一个使用特定构造函数参数FooHelper实例化的静态类)Foo

我收到以下错误

错误 CS0181 属性构造函数参数“foo”的类型为“Foo[]”,它不是有效的属性参数类型

但为什么它不起作用?在测试时,我更改了Foofor的类型string并且它可以工作,所以我应该能够毫无问题地通过一个类,对吧?

或者我不能通过抽象类?或者不能在构造函数中传递带参数的类?还是有其他原因导致此错误?我想不通...

标签: c#data-annotations

解决方案


构造函数的参数Attribute必须是常量、类型或它们的一维数组。

你不能使用任何仅仅是静态只读的东西。因此,您主要限于string, 数字文字和常量,enums以及Type. 你甚至不能使用Decimal.

一种解决方法是让您的 Attribute 构造函数的参数成为您可以在 Attribute 构造函数的代码中使用的参数来创建自己的实例。

注意另一个常见的问题Attributes是它们有时会变成每组参数的单例。您几乎无法控制Attributes.

如果以下所有语句都为真,则表达式 E 是 attribute_argument_expression:

  • E 的类型是属性参数类型。
  • 在编译时, E 的值可以解析为以下之一:
    • 一个常数值。
    • 一个 System.Type 对象。
    • attribute_argument_expressions 的一维数组。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/attributes

属性类的位置参数和命名参数的类型仅限于属性参数类型,它们是:

  • 以下类型之一:bool、byte、char、double、float、int、long、sbyte、short、string、uint、ulong、ushort。
  • 类型对象。
  • 类型 System.Type。
  • 枚举类型,前提是它具有公共可访问性,并且它嵌套的类型(如果有)也具有公共可访问性(属性规范)。
  • 上述类型的一维数组。不具有这些类型之一的构造函数参数或公共字段不能用作属性规范中的位置参数或命名参数。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/attributes#attribute-parameter-types


推荐阅读