我在论坛上没有找到任何答案(但是,如果有答案,请告诉我)。我正在为ASP.NET MVC应用程序编写后端结构,并且在C#情况下遇到一些麻烦。
我想知道这样的解决方案是否可能发生(并且需要按照我的描述或类似方式做以下事情)。 我将在下面的示例中显示该问题,因为我不知道如何用语言清楚地说明问题。
我将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; }
}
然后我想通过以下方式使用它:
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#方面还不是很先进。感谢您的任何帮助。
答案 0 :(得分:1)
属性是编译时的东西。因此,您还必须在编译时提供所有信息。但是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; }
}
除此之外,当它中显然只有SItems
个元素时,我看不出为什么您的IEnumerable<object>
是Enums
类型。如here所述,甚至不可能在属性上使用IEnumerable
,仅允许使用原始类型的数组。因此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; }