gpt4 book ai didi

c# - 'MyEnum' 类型的表达式不能用于类型参数

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:21 25 4
gpt4 key购买 nike

我为我的枚举创建了 Enum ToFrendlyString 函数,但我不能在 Linq 中使用。

 public enum MyEnum
{

Queued = 0,
[Description("In progress")]
In_progress = 2,
[Description("No answer")]
No_answer = 6,

}



public static class EnumToFrendlyString
{

public static string ToFrendlyString(this Enum value)
{
return value.GetEnumDescription();
}


public static string GetEnumDescription(this Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());

var attributes =
(DescriptionAttribute[])fi.GetCustomAttributes(
typeof(DescriptionAttribute),
false);

if (attributes.Length > 0)
return attributes[0].Description;

return value.ToString();
}
}

当我尝试在 Linq 中使用此函数时,出现错误

  var res = collection.AsQueryable().Where(p => p.UserID == UserID).OrderByDescending(p=> p.DateCreated).Select(p => new MyClass
{
Date = p.DateCreated.ToString(),
Status = p.Status.ToFrendlyString(),
}).Take(10).ToList();

如果我在同一个类中创建另一个函数,比如

 private string MyStatusToString(MyEnum status)
{
return status.ToFrendlyString();
}

并更改我的 Linq 以使用此函数,然后一切正常。

错误

Expression of type 'DAL.MyEnum' cannot be used for parameter of type 'System.Enum' of method 'System.String ToFrendlyString(System.Enum)'

最佳答案

我不确定您是否可以使用 Enum 作为扩展方法的类型 - 试试这个。我冒昧地整理了一些代码,请随意忽略这些更改:)

public static class EnumToFrendlyString
{
public static string ToFrendlyString<T>(this T value)
where T : struct
{
return value.GetEnumDescription();
}

public static string GetEnumDescription<T>(this T value)
where T : struct
{
return EnumDescriptionCache<T>.Descriptions[value];
}

private static class EnumDescriptionCache<T>
where T : struct
{
public static Dictionary<T, string> Descriptions =
Enum.GetValues(typeof(T))
.Cast<T>()
.ToDictionary(
value => value,
value => value.GetEnumDescriptionForCache());
}

private static string GetEnumDescriptionForCache<T>(this T value)
where T : struct
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("Only use with enums", "value");
}

var descriptionAttribute = typeof(T)
.GetField(value.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.Cast<DescriptionAttribute>()
.FirstOrDefault();

return (descriptionAttribute != null)
? descriptionAttribute.Description
: value.ToString();
}
}

我添加了一个私有(private)的通用类来缓存您的枚举成员的描述,以避免运行时大量使用反射。进出类首先缓存然后检索值看起来有点奇怪,但它应该工作正常:)

我在 this answer 中给出的警告仍然适用 - 传递给字典的枚举值未经验证,因此您可以通过调用 ((MyEnum)5367372).ToFrendlyString() 使其崩溃。

关于c# - 'MyEnum' 类型的表达式不能用于类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com