0

私は次のコードを持っています:

        var values1 = (EReferenceKey[])Enum.GetValues(typeof(EReferenceKey)); 
        var valuesWithNames = values1.Select(
            value => new {
                Value = ((int)value).ToString("00"),
                Text = Regex.Replace(value.ToString(), "([A-Z])", " $1").Trim() 
            });

このメソッドをジェネリックにすることができるstackoverflowで提案されたいくつかのコードは次のとおりです。

    public static IEnumerable<KeyValuePair<string, string>> GetValues2<T>() where T : struct {
        var t = typeof(T);
        if (!t.IsEnum)
            throw new ArgumentException("Not an enum type");
        return Enum.GetValues(t)
            .Cast<T>()
            .Select(x => new KeyValuePair<string, string>(
                ((int)Enum.ToObject(t, x)).ToString("00"), 
                Regex.Replace(x.ToString(), "([A-Z])", " $1").Trim()
                ));
    }

ほぼ同じ結果になりますが、「値」と「テキスト」という名前がありません。誰かが私に後者のコードを変更してこれらを追加し、それでも結果を順番に返す方法を提案できますか?

自分で試してみましたが、ジェネリックの選択に「Value=」と「Text=」を追加しようとするとエラーが発生しました。

エラー6名前'Value'は現在のコンテキストに存在しません

4

1 に答える 1

2

値が返されるクラスを定義する必要があります。

public class YourValues
{
    public string Value {get; set;}
    public string Text {get; set;}
}

そして、次のように変更します。

public static IEnumerable<YourValues> GetValues2<T>() where T : struct 
{
    var t = typeof(T);
    if (!t.IsEnum)
        throw new ArgumentException("Not an enum type");
    return Enum.GetValues(t)
        .Cast<T>()
        .Select(x => new YourValues{
            Value = ((int)Enum.ToObject(t, x)).ToString("00"), 
            Text = Regex.Replace(x.ToString(), "([A-Z])", " $1").Trim()
            });
}
于 2012-09-17T00:16:00.503 に答える