Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取IEnumerable<;字符串>;枚举值属性的类型?_C#_Enums - Fatal编程技术网

C# 如何获取IEnumerable<;字符串>;枚举值属性的类型?

C# 如何获取IEnumerable<;字符串>;枚举值属性的类型?,c#,enums,C#,Enums,对于枚举值,我有一个StringValue属性,因此我可以为每个值附加一个说明: public class StringValueAttribute : Attribute { public string Value { get; private set; } public StringValueAttribute(string value) { Value = value; } } 这就是我使用它的方式: enum Group { [

对于枚举值,我有一个
StringValue
属性,因此我可以为每个值附加一个说明:

public class StringValueAttribute : Attribute
{
    public string Value { get; private set; }

    public StringValueAttribute(string value)
    {
        Value = value;
    }
}
这就是我使用它的方式:

enum Group
{
    [StringValue("Computer Science")]
    ComputerScience,

    [StringValue("Software Engineering")]
    SoftwareEngineering,

    // ... additional values follow.
}
我有一个方法,在给定枚举值的情况下检索
StringValue

public static string GetStringValue(Enum value)
{
    Type type = value.GetType();
    FieldInfo fieldInfo = type.GetField(type.ToString());
    StringValueAttribute[] attributes = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

    string stringValue = null;
    if (attributes.Length > 0)
    {
        stringValue = attributes[0].Value;
    }

    return stringValue;
}
我想使用另一个方法获取枚举(枚举本身,而不是值),并使用
GetStringValue
方法检索
IEnumerable
。我不知道如何做到这一点。像这样的方法是什么样子的


编辑:这个问题不是重复的。我知道如何获取枚举属性值,实际上我有一个方法可以做到这一点。我的问题是如何枚举枚举中的所有属性。

这应该可以:

static void Main(string[] args)
{
    foreach (var item in GetStringNames<Group>())
    {
        Console.WriteLine(item);
    }
}
public static string GetStringValue(Enum value)
{
    Type type = value.GetType();
    FieldInfo fieldInfo = type.GetField(value.ToString());
    StringValueAttribute[] attributes = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

    string stringValue = null;
    if (attributes.Length > 0)
    {
        stringValue = attributes[0].Value;
    }

    return stringValue;
}

public static IEnumerable<string> GetStringNames<T>()
{
    var type = typeof(T);

    if (type.IsEnum == false)
    {
        throw new ArgumentException("T must be an Enum type");
    }

    var values = type.GetEnumValues();

    foreach (var item in values)
    {
        yield return GetStringValue((Enum)item);
    }
}
static void Main(字符串[]args)
{
foreach(GetStringNames()中的变量项)
{
控制台写入线(项目);
}
}
公共静态字符串GetStringValue(枚举值)
{
Type Type=value.GetType();
FieldInfo FieldInfo=type.GetField(value.ToString());
StringValueAttribute[]attributes=fieldInfo.GetCustomAttributes(typeof(StringValueAttribute),false)作为StringValueAttribute[];
字符串stringValue=null;
如果(attributes.Length>0)
{
stringValue=属性[0]。值;
}
返回字符串值;
}
公共静态IEnumerable GetStringNames()
{
var类型=类型(T);
if(type.IsEnum==false)
{
抛出新ArgumentException(“T必须是枚举类型”);
}
var values=type.GetEnumValues();
foreach(值中的var项)
{
收益返回GetStringValue((枚举)项);
}
}
这应该可以:

static void Main(string[] args)
{
    foreach (var item in GetStringNames<Group>())
    {
        Console.WriteLine(item);
    }
}
public static string GetStringValue(Enum value)
{
    Type type = value.GetType();
    FieldInfo fieldInfo = type.GetField(value.ToString());
    StringValueAttribute[] attributes = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

    string stringValue = null;
    if (attributes.Length > 0)
    {
        stringValue = attributes[0].Value;
    }

    return stringValue;
}

public static IEnumerable<string> GetStringNames<T>()
{
    var type = typeof(T);

    if (type.IsEnum == false)
    {
        throw new ArgumentException("T must be an Enum type");
    }

    var values = type.GetEnumValues();

    foreach (var item in values)
    {
        yield return GetStringValue((Enum)item);
    }
}
static void Main(字符串[]args)
{
foreach(GetStringNames()中的变量项)
{
控制台写入线(项目);
}
}
公共静态字符串GetStringValue(枚举值)
{
Type Type=value.GetType();
FieldInfo FieldInfo=type.GetField(value.ToString());
StringValueAttribute[]attributes=fieldInfo.GetCustomAttributes(typeof(StringValueAttribute),false)作为StringValueAttribute[];
字符串stringValue=null;
如果(attributes.Length>0)
{
stringValue=属性[0]。值;
}
返回字符串值;
}
公共静态IEnumerable GetStringNames()
{
var类型=类型(T);
if(type.IsEnum==false)
{
抛出新ArgumentException(“T必须是枚举类型”);
}
var values=type.GetEnumValues();
foreach(值中的var项)
{
收益返回GetStringValue((枚举)项);
}
}

最简单的方法是使用泛型,尽管您始终可以传入特定的
枚举的实例,获取其类型,然后返回其所有值的
StringValue
值:

public static class EnumExtensions
{
    public static IEnumerable<string> GetStringValues<TEnum>() where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        return Enum.GetValues(typeof(TEnum))
            .Cast<Enum>()
            .Select(e => e.GetStringValue())
            .ToList();
    }

    public static IEnumerable<string> GetStringValuesOfType(Enum value)
    {
        return Enum.GetValues(value.GetType())
            .Cast<Enum>()
            .Select(e => e.GetStringValue())
            .ToList();
    }

    public static string GetStringValue(this Enum value)
    {
        Type type = value.GetType();
        FieldInfo fieldInfo = type.GetField(value.ToString());
        StringValueAttribute[] attributes = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

        string stringValue = null;
        if (attributes.Length > 0)
        {
            stringValue = attributes[0].Value;
        }

        return stringValue;
    }
}
公共静态类枚举扩展
{
公共静态IEnumerable GetStringValues(),其中TEnum:struct,IConvertible,IComparable,IFormattable
{
返回Enum.GetValues(typeof(TEnum))
.Cast()
.Select(e=>e.GetStringValue())
.ToList();
}
公共静态IEnumerable GetStringValuesType(枚举值)
{
返回Enum.GetValues(value.GetType())
.Cast()
.Select(e=>e.GetStringValue())
.ToList();
}
公共静态字符串GetStringValue(此枚举值)
{
Type Type=value.GetType();
FieldInfo FieldInfo=type.GetField(value.ToString());
StringValueAttribute[]attributes=fieldInfo.GetCustomAttributes(typeof(StringValueAttribute),false)作为StringValueAttribute[];
字符串stringValue=null;
如果(attributes.Length>0)
{
stringValue=属性[0]。值;
}
返回字符串值;
}
}
注:

  • c#中没有
    where TEnum:Enum
    约束。将
    TEnum
    限制为
    struct、IConvertible、IComparable、IFormattable
    就足够了

  • 这就是说,有一个巧妙的技巧来应用
    enum
    约束,如to by所示。(不过我没有在这个答案中使用它,因为它真的非常狡猾。)

  • 正如@EdPlunkett的评论中所指出的,您需要将
    value.ToString()
    传递给
    type.GetField()
    ,因为您得到的字段对应于特定的传入
    enum


Sample

执行此操作最简单的方法是使用泛型,尽管您始终可以传入特定
枚举的实例,获取其类型,然后返回其所有值的
StringValue
值:

public static class EnumExtensions
{
    public static IEnumerable<string> GetStringValues<TEnum>() where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        return Enum.GetValues(typeof(TEnum))
            .Cast<Enum>()
            .Select(e => e.GetStringValue())
            .ToList();
    }

    public static IEnumerable<string> GetStringValuesOfType(Enum value)
    {
        return Enum.GetValues(value.GetType())
            .Cast<Enum>()
            .Select(e => e.GetStringValue())
            .ToList();
    }

    public static string GetStringValue(this Enum value)
    {
        Type type = value.GetType();
        FieldInfo fieldInfo = type.GetField(value.ToString());
        StringValueAttribute[] attributes = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

        string stringValue = null;
        if (attributes.Length > 0)
        {
            stringValue = attributes[0].Value;
        }

        return stringValue;
    }
}
公共静态类枚举扩展
{
公共静态IEnumerable GetStringValues(),其中TEnum:struct,IConvertible,IComparable,IFormattable
{
返回Enum.GetValues(typeof(TEnum))
.Cast()
.Select(e=>e.GetStringValue())
.ToList();
}
公共静态IEnumerable GetStringValuesType(枚举值)
{
返回Enum.GetValues(value.GetType())
.Cast()
.Select(e=>e.GetStringValue())
.ToList();
}
公共静态字符串GetStringValue(此枚举值)
{
Type Type=value.GetType();
FieldInfo FieldInfo=type.GetField(value.ToString());
StringValueAttribute[]attributes=fieldInfo.GetCustomAttributes(typeof(StringValueAttribute),false)作为StringValueAttribute[];
字符串stringValue=null;
如果(attributes.Length>0)
{
stringValue=属性[0]。值;
}
返回字符串值;
}
}
注:

  • c#中没有
    where TEnum:Enum
    约束。将
    TEnum
    限制为
    struct、IConvertible、IComparable、IFormattable
    就足够了

  • 也就是说,有一个巧妙的技巧可以应用
    enum
    约束