将枚举分配为 属性 c#

Assign enum as property c#

我在论坛上没有找到任何答案(但是如果有请告诉我)。我正在为 ASP.NET MVC 应用程序编写后端结构,但在使用 C# 案例时遇到了一些麻烦。

我想知道这样的解决方案是否有可能发生(并且需要按照我描述的方式或类似方式执行以下操作)。 我将在下面的示例中显示问题,因为我不知道如何用语言表达清楚。

我定义了枚举如下:

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; }
    }

那我想按下面的方式使用它:

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

    [SearchTypeAttribute(
        SType = typeof(Enums.myEnum),
        SItems =  Enum.GetValues(typeof(Enums.myEnum))
    )]
    public string Type{ get; set; } // later to this item will be assigned string name of the assigned value
 }

当我这样做时,出现以下错误:

错误 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 中使用 "Type" 或 属性 的什么,以便能够在那里分配这些值。

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

我应该使用什么类型来分配这种类型的数据 SItems? 还有其他方法吗? 我在 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; } 

 }

除此之外,我不明白为什么你的 SItemsIEnumerable<object> 类型,而它显然只有 Enums 个元素。甚至不可能在属性上使用 IEnumerable,只允许使用原始类型数组,如前所述 here。所以 SItems 应该是 Enums[].

另一种方法是依赖属性构造函数并从那里初始化SItems

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; }