我有一堂课叫做MyProduct
如下所示
public class MyProduct {
public string Id { get; set; }
public string CustomId { get; set; }
}
然后我创建了另一个课程ListProducts
public class ListProducts
{
public static readonly List<MyProduct > MyListOfProducts = new List<MyProduct >()
{
new MyProduct(){
Id = "1",
CustomId = ((int)MyEnum.NameOfService).ToString()
},
new MyProduct(){
Id = "2",
CustomId = ((int)MyEnum.AgeOfService).ToString()
}
};
public enum MyEnum{
NameOfService = 12,
AgeOfService = 11
}
}
现在,我想在类ListProducts
中创建一个方法,当我向其传递ID时,它将返回我enum
字符串。
例如,如果我通过Id = 1
,那么它应该以{NameOfService”的身份返回我enum
的值
我正在尝试类似以下的内容
public static MyEnum GetStringFromEnum(string id) => ListProducts.FirstOrDefault(x=> x.Id == Id);
但是它没有返回我的enum
值
答案 0 :(得分:2)
您可以尝试一下吗?
public MyEnum GetStringFromEnum(string id)
{
var product = MyListOfProducts.FirstOrDefault(x => x.Id.Equals(id));
MyEnum myEnum = (MyEnum)Convert.ToInt32(product?.CustomId);
return myEnum;
}
对于单行:
public MyEnum GetStringFromEnum(string id) =>(MyEnum) Convert.ToInt32(MyListOfProducts.FirstOrDefault(x => x.Id.Equals(id))?.CustomId);
答案 1 :(得分:1)
您的方法名为“ GetStringFromEnum”,但是您正在传递ID和ID,并返回一个枚举。我将其称为“ GetEnumFromId”或仅“ GetEnum”。同时将CustomId属性设置为int。您仍然需要将其强制转换为(int),但不再需要使用.toString。
public class MyProduct {
public string Id { get; set; }
public int CustomId { get; set; }
}
public static readonly List<MyProduct > MyListOfProducts = new List<MyProduct >()
{
new MyProduct(){
Id = "1",
CustomId = (int)MyEnum.NameOfService
},
new MyProduct(){
Id = "2",
CustomId = (int)MyEnum.AgeOfService
}
}
也无需编号您的枚举。在NameOfServer下将为1,在AgeOfService下将为2。
public enum MyEnum{
NameOfService,
AgeOfService
}
然后您可以执行以下操作:
public static MyEnum GetEnum(string id) => ListProducts.FirstOrDefault(x=> x.CustomId == Id);
答案 2 :(得分:1)
如果要从其值中获取枚举名称,则可以使用Enum.GetName()方法,如下所示。您可以传递产品ID,并基于此获得枚举值,下面的函数将为您提供枚举名称
Enum.GetName(typeof(MyEnum), 2)
答案 3 :(得分:1)
您可以使用System.Enum
为您获取名称。
您应该查看其中的所有methods-它们可以帮助满足您的枚举需求。
string GetProduct(int number)
{
int index = lookupIndex(number);
return Enum.GetNames(typeof(MyEnum))[index];
}
private int lookupIndex(int number)
{
//this fits your current metadata, you could adapt the lookup here.
return number - 1;
}
接受的答案偏离了我的期望。这是要考虑的其他片段:
public MyEnum GetProduct(string name)
{
return (MyEnum)Enum.Parse(typeof(MyEnum), name);
}
public MyEnum GetProduct(int number)
{
return (MyEnum)number;
}
private int lookupIndex(int number)
{
Array values = Enum.GetValues(typeof(MyEnum));
int[] intArray = (int[])values;
return Array.FindIndex(intArray, x => x == number);
}
以下是一些可能会派上用场的相关问题的其他选择:
using System;
using System.Linq;
public enum foo
{
unknown = 0,
bar = 42,
baz
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"Enum.GetName : '{Enum.GetName(typeof(foo), 42)}'");
var getnames = Enum.GetNames(typeof(foo));
string names = string.Join(", ", getnames);
Console.WriteLine($"Enum.GetNames : '{names}'");
var getValues = Enum.GetValues(typeof(foo)); ;
var values = string.Join(", ", from v in getValues.Cast<int>() select v.ToString());
Console.WriteLine($"Enum.GetValues: '{values}'");
foo caseSensitiveUnknown = (foo)Enum.Parse(typeof(foo), nameof(foo.unknown));
Console.WriteLine($"Enum.Parse 1: '{caseSensitiveUnknown}'");
foo ignoreCaseUnknown = (foo)Enum.Parse(typeof(foo), "UnKnoWn", true);
Console.WriteLine($"Enum.Parse 2: '{ignoreCaseUnknown}'");
}
}
我认为您更深层的设计问题是,对于似乎相同的事物,您有5个身份。您的5个身份分别是MyEnum
,CustomId
,Id
,(int)MyEnum
,Enum.GetName(typeof(MyEnum), e)
。
问题是,即使在大型系统中,您也需要维护所有它们。在某个时候,您将创建一个带有用于枚举的表的数据库,并且还需要在连接库上维护名称和整数。与其选择像这样的大型big依派对,要么:
public class MyEnumConverter
{
public static string ToCustomId(MyEnum e) => $"{(int)e}";
public static string ToId(MyEnum e) => ListProducts.MyListOfProducts.First(x => x.CustomId == $"{(int)e}").Id;
public static int ToEnumValue(MyEnum e) => (int)e;
public static string ToEnumName(MyEnum e) => Enum.GetName(typeof(MyEnum), e);
public static MyEnum FromCustomId(string customId) => (MyEnum)(int.Parse(customId));
public static MyEnum FromId(string Id) => FromCustomId(ListProducts.MyListOfProducts.First(x => x.Id == Id).CustomId);
public static MyEnum FromEnumValue(int enumValue) => (MyEnum)(enumValue);
public static MyEnum FromEnumName(string name) => (MyEnum)Enum.Parse(typeof(MyEnum), name);
}
考虑只为完全独立于含义的System.Guid
之类的产品维护一个唯一的ID。
答案 4 :(得分:0)
您可以尝试获取指定整数值的名称,然后获取枚举:
int integerenumvalue = 14;
string stringenum = Enum.GetName(typeof(MyEnum), integerenumvalue);
MyEnum enumvalue = (MyEnum)Enum.Parse(typeof(MyEnum), stringenum);
答案 5 :(得分:0)
除了这里给出的获得价值的答案外,我对设计也很关注。这两个数字是常量还是配置值?
在这种情况下,我强烈反对使用枚举。