微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么使用params的C#属性对我的课程不起作用,但对字符串有效?

如何解决为什么使用params的C#属性对我的课程不起作用,但对字符串有效?

我有一个在构造函数中使用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的类型string更改为有效,因此我应该可以顺利通过类,对吗?

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

解决方法

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

您不能仅使用静态只读。因此,您大多限于string,数字文字和常量,enumsType。您甚至不能使用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。