【发布时间】: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