3

だから私は列挙型を持っています:

public enum myEnum
{
    IBM = 1,
    HP = 2,
    Lenovo = 3
}

Brandクラスがあります

public class Brand
{
    public Brand(string name, int id)
    {
        Name = name;
        Id = id;
    }

    public string Name { get; private set; }
    public int Id { get; private set; }
}

Brandからのデータが取り込まれたオブジェクトのリストを作成したいと考えていますMyEnum。何かのようなもの:

private IEnumerable<Brand> brands = new List<Brand>
{
    new Brand(myEnum.IBM.ToString(), (int) myEnum.IBM),
    new Brand(myEnum.HP.ToString(), (int) myEnum.HP),
    new Brand(myEnum.Lenovo.ToString(), (int) myEnum.Lenovo),
};

2 つの配列を作成できます。1 つは列挙型の名前を持ち、もう 1 つは列挙型の ID を持ち、それらを foreach して反復ごとに Brand オブジェクトを作成しますが、より良い解決策があるかどうか疑問に思います。

最後に、Royi Mindel ソリューションを使用します。Daniel Hilgarth の回答と、Royi Mindel の提案を機能させる手助けをしてくれたことに感謝します。できれば、この質問に対して両方の功績を認めたいと思います。

public static class EnumHelper
{
    public static IEnumerable<ValueName> GetItems<TEnum>() 
        where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        if (!typeof(TEnum).IsEnum)
            throw new ArgumentException("TEnum must be an Enumeration type");

        var res = from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>()
                  select new ValueName() { Id = Convert.ToInt32(e), Name = e.ToString() };

        return res;
    }
}

public struct ValueName
{
    public int Id { get; set; }
    public string Name { get; set; }
}
4

3 に答える 3

3

すべての列挙型に適合するように一般的な ValueName クラスを作成し、特定の列挙型に適合するように特定のクラスを作成しないことをお勧めします

public static class EnumHelper
{
    public static IEnumerable<ValueName> GetItems<TEnum>() 
        where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        if (!typeof(TEnum).IsEnum)
            throw new ArgumentException("TEnum must be an Enumeration type");

        var res = from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>()
                    select new ValueName() { Value = Convert.ToInt32(e), Name = e.ToString()};

        return res;
    }

}

public struct ValueName
{
    public int Value { get; set; }
    public string Name { get; set; }
}

次に、次のようにします。

EnumHelper.GetItems<myEnum>()
于 2013-10-07T08:40:57.807 に答える
2

あなたのコードは非常に優れていましたが、コードのビット レベルの簡略化を変更しました。

列挙型クラス (変更なし):

public enum myEnum
{
    IBM = 1,
    HP = 2,
    Lenovo = 3
}

ブランドクラス (パラメーターの長さを変更します。Enum のパラメーターを 1 つ渡すことができます):

public class Brand
{
    public Brand(Enum Data)
    {
        Name = Data.ToString();
        Id = Convert.ToInt32(Data); 
    }

    public string Name { get; private set; }
    public int Id { get; private set; }
}

そして、ここでこのように変更します:

private IEnumerable<Brand> brands = new List<Brand>
{
    new Brand(myEnum.IBM),
    new Brand(myEnum.HP),
    new Brand(myEnum.Lenovo),
};

そして、あなたはこのサンプルを見るのが好きです: C# Iterating through an enum? (System.Array のインデックス作成)

于 2013-10-07T08:46:55.947 に答える