如何在C#中传递带有List <string>的属性参数类型?

use*_*414 8 c# asp.net-mvc

如何将列表传递给construtor?

它显示一条消息:

错误14属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

public class CustomAuthorize : AuthorizeAttribute {
    private List<string> multipleProgramID;

    //constructor
    public CustomAuthorize(List<string> _multipleProgramID) {
        multipleProgramID = _multipleProgramID;
    }
}

[CustomAuthorize(new List<string>(new string[] { ProgramList.SURVEY_INPUT, ProgramList.SURVEY_OUTPUT } ))]
[HttpPost]
public ActionResult DeleteWaterQualityItems(string sourceID, string wqID) {
    // ..other code...
}

public class ProgramList {
    public const string SURVEY_INPUT = "A001";
    public const string SURVEY_INPUT = "A002";
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 13

一般来说问题不是传递List<string>给构造函数- 问题是你试图将它用于属性.你基本上不能这样做,因为它不是编译时常量.

看起来它ProgramList实际上是一个枚举 - 所以你可能想把它变成枚举:

 [Flags]
 public enum ProgramLists
 {
     SurveyInput,
     SurveyOutput,
     ...
 }
Run Code Online (Sandbox Code Playgroud)

然后使你的CustomAuthorizeAttribute(应该这样命名,后缀为Attribute)ProgramLists在构造函数中接受a .您将其指定为:

[CustomAuthorize(ProgramLists.SurveyInput | ProgramLists.SurveyOutput)]
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用单独的方法将每个ProgramLists元素映射到字符串,例如"A001".这可以通过将属性应用于每个元素,或者可能具有Dictionary<ProgramLists, string>某个元素来完成.

如果你真的想继续使用这样的字符串,你可以CustomAuthorizeAttribute接受一个以逗号分隔的列表,或者使它成为一个数组而不是一个列表并使用一个参数数组:

[AttributeUsage(AttributeTargets.Method)]
public class FooAttribute : Attribute
{
    public FooAttribute(params string[] values)
    {
        ...
    }
}

[Foo("a", "b")]
static void SomeMethod()
{
}
Run Code Online (Sandbox Code Playgroud)

  • @curiousBoy:是的,属性仍然不能使用列表。 (2认同)

小智 6

您不能使用List <T>.

属性对参数和属性类型有限制,因为它们必须在编译时可用.在C#中使用属性

改为使用数组:

//constructor
public CustomAuthorize(string[] _multipleProgramID) 
{
    ...
}

// usage
[CustomAuthorize(new string[] { ProgramList.SURVEY_INPUT, ProgramList.SURVEY_OUTPUT })]
Run Code Online (Sandbox Code Playgroud)