将枚举指定为属性c#

将枚举指定为属性c#,c#,enums,properties,custom-attributes,C#,Enums,Properties,Custom Attributes,我在论坛上没有找到任何答案(但是如果有,请让我知道)。我正在为ASP.NET MVC应用程序编写后端结构,在C#case方面遇到了一些问题 我想知道这样的解决方案是否可能发生(并且需要按照我描述的方式或类似方式做以下事情)。 我将在下面的例子中说明这个问题,因为我不知道如何用语言表达清楚 我已将Enum定义如下: public enum myEnum { FirstOpt = 0, SecondOpt= 1, ThirdOpt = 2, Unknown = -1

我在论坛上没有找到任何答案(但是如果有,请让我知道)。我正在为ASP.NET MVC应用程序编写后端结构,在C#case方面遇到了一些问题

我想知道这样的解决方案是否可能发生(并且需要按照我描述的方式或类似方式做以下事情)。 我将在下面的例子中说明这个问题,因为我不知道如何用语言表达清楚

我已将Enum定义如下:

public enum myEnum
{
    FirstOpt = 0,
    SecondOpt= 1,
    ThirdOpt = 2,

    Unknown = -1,
}
现在,我想在自定义属性中为解决方案的不同部分分配myEnum

该属性的外观如下所示:

    public class SearchTypeAttribute : Attribute
    {
        public Type SType { get; set; }

        public IEnumerable<object> SItems { get; set; }
    }
执行此操作时,会出现以下错误:

错误CS0655“SItems”不是有效的命名属性参数,因为它不是有效的属性参数类型

我还试图将其指定为:

public class SomeClass
{
    [Key]
    public long Id { get; set; }

    [SearchTypeAttribute(
        SType = typeof(Enums.myEnum),
        SItems =  Enums.myEnum // here !
    )]
    public string Type{ get; set; } 

 }
但我仍然不知道我应该在SearchTypeAttribute中使用什么“类型”的属性,以便能够在那里分配这些值

我这样做是为了能够在以后的视图中的搜索栏中生成不同类型的字段。 然后在我的代码中,我想将枚举值列表或特定的枚举分配给某个变量,这样我就可以对这些值进行操作

我应该使用什么类型来分配这种类型的数据站点? 还有其他方法吗?
我在c#方面还没有真正的进步。谢谢你事先的帮助

属性是编译时的东西。因此,您还必须在编译时提供所有信息。但是
Enum.GetValues
将在运行时执行,因此无法用于属性。实现这一点的唯一方法是将可能的枚举值直接写入属性:

public class SomeClass
{
    [Key]
    public long Id { get; set; }

    [SearchTypeAttribute(
        SType = typeof(Enums.myEnum),
        SItems =  new[] { Enums.FirstOpt, Enums.SecondOpt, ...}
    )]
    public string Type{ get; set; } 

 }
除此之外,我不明白为什么你的
站点
IEnumerable
类型,而它显然只有
枚举
-元素。甚至不可能在属性上使用
IEnumerable
,如前所述,只允许使用基元类型的数组。所以
SItems
应该是
Enums[]

另一种方法是依赖属性构造函数并从中初始化
站点

public class SearchTypeAttribute : Attribute
{
    public SearchTypeAttribute(Type type)
    {
        this.SType = type;
        this.SItems = Enum.GetValues(type);
    }

}
现在只需按如下方式使用该属性:

[SearchTypeAttribute(typeof(Enums.myEnum))]
public string Type{ get; set; } 

属性是编译时的东西。因此,您还必须在编译时提供所有信息。但是,
Enum.GetValues
将在运行时执行,因此无法用于属性。实现这一点的唯一方法是将可能的枚举值直接写入属性中。这是一个相当不寻常的设计,这里的用例是什么?我的蜘蛛感觉告诉我这已经写满了它如果你从属性中删除
SItems
属性,你可以使用你的属性在运行时使用
Enum.GetValues()
为UI生成项目。您只需要属性中的
SType
。@常规我需要在视图中将这些枚举生成为下拉列表。每个视图都有不同的字段,有些字段必须是基于枚举的下拉列表。我使用ViewData[]和DropdownList来完成它,到目前为止,它在一个枚举中工作得非常好。但是当我在视图中生成10个下拉列表时,我不想粘贴相同的代码并更改ViewData的名称(ViewData[“enumOne”]、ViewData[“enumTwo”]等)。相反,我想在循环中生成它们。这就是为什么我需要将这些枚举和属性“配对”。你知道吗?也许有什么方法可以用其他方式实现我的目标?
[SearchTypeAttribute(typeof(Enums.myEnum))]
public string Type{ get; set; }