【问题标题】:Assign enum as property c#将枚举分配为属性 c#
【发布时间】:2019-02-01 21:03:05
【问题描述】:

我在论坛上没有找到任何答案(但是如果有,请告诉我)。我正在为 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 中使用什么“类型”属性,以便能够在那里分配这些值。

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

我应该使用什么类型来分配这种类型的数据 SItems ? 还有其他方法吗? 我在 c# 方面还不是很先进。感谢您提前提供任何帮助。

【问题讨论】:

  • 属性是编译时的东西。因此,您还必须在编译时提供所有信息。但是Enum.GetValues 将在runtime 执行,因此无法用于属性。实现这一点的唯一方法是将可能的枚举值直接写入属性。
  • 这是一个相当不寻常的设计,这里的用例是什么?我的蜘蛛侠感官告诉我这上面写满了 XY
  • 如果您从属性中删除SItems 属性,您可以使用您的属性在运行时使用Enum.GetValues() 为UI 生成项目。您只需要属性中的SType 即可执行此操作。
  • @TheGeneral 我需要将这些枚举生成为视图中的下拉列表。每个视图都有不同的字段,有些必须是基于枚举的下拉列表。我正在使用 ViewData[] 和 DropdownList 来做到这一点,到目前为止它对于一个枚举来说非常有效。但是当我在视图中生成 10 个下拉列表时,我不想应付粘贴相同的代码并更改 ViewData 的名称(ViewData["enumOne"]、ViewData["enumTwo"] 等)。相反,我想在循环中生成它们。这就是为什么我需要将这些枚举与属性“配对”。你知道也许有什么方法可以以任何其他方式实现我的目标吗?

标签: c# enums properties custom-attributes


【解决方案1】:

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

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&lt;object&gt; 类型,而它显然只有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; } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2013-01-08
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多