c# - 为什么使用 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[]”,它不是有效的属性参数类型
但为什么它不起作用?在测试时,我更改了Foo
for的类型string
并且它可以工作,所以我应该能够毫无问题地通过一个类,对吧?
或者我不能通过抽象类?或者不能在构造函数中传递带参数的类?还是有其他原因导致此错误?我想不通...
解决方案
构造函数的参数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。
- 枚举类型,前提是它具有公共可访问性,并且它嵌套的类型(如果有)也具有公共可访问性(属性规范)。
- 上述类型的一维数组。不具有这些类型之一的构造函数参数或公共字段不能用作属性规范中的位置参数或命名参数。
推荐阅读
- ios - libRNLaunchNavigator 的 React 本机链接器命令失败
- laravel - Voyager 管理面板链接已损坏
- php - 如何通过索引 $sheet->getRowIterator() 获取行?
- bash - 将“tail -f”输出重定向到 COPY 命令
- html - 背景颜色拒绝在 Outlook 中应用
- javascript - Html 未按预期呈现 javascript 断线
- java - 交换可绘制图像的文本
- db2 - 如何根据一定的逻辑创建一个检索年份的函数
- swift - 如何将fileurl(swift)转换为编码的utf8 hex?
- python - Thonny IDE 在启动时抛出 AssertionError