rawvalue - C#でenumからint値を取得




vb net enum parse example (17)

Enumは任意の整数型( byteintshortなど)であることができるため、Enumの基本的な整数値を取得するためのより堅牢な方法は、 GetTypeCodeメソッドをConvertクラスと併用することです。

enum Sides {
    Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;

object val = Convert.ChangeType(side, side.GetTypeCode());
Console.WriteLine(val);

これは基本的な整数型にかかわらず動作するはずです。

Questions (複数形)というクラスがあります。 このクラスには、このようなQuestion (単数)と呼ばれる列挙型があります。

public enum Question
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

Questionsクラスでは、そのfoo Questionsオブジェクトを返すget(int foo)関数があります。 Questions.Get(Question.Role)ようなことをすることができるように、列挙から整数値を取得する簡単な方法はありますか?


Vb。 そのはず

Public Enum Question
    Role = 2
    ProjectFunding = 3
    TotalEmployee = 4
    NumberOfServers = 5
    TopBusinessConcern = 6
End Enum

Private value As Integer = CInt(Question.Role)

enumをintに変換するのではなく、これを試してください:

public static class ReturnType
{
    public static readonly int Success = 1;
    public static readonly int Duplicate = 2;
    public static readonly int Error = -1;        
}

intまたはそれより小さい列挙型の私のfavのハック:

GetHashCode();

列挙型の場合

public enum Test
{
    Min = Int32.MinValue,
    One = 1,
    Max = Int32.MaxValue,
}

この

var values = Enum.GetValues(typeof(Test));

foreach (var val in values) 
{
    Console.WriteLine(val.GetHashCode());
    Console.WriteLine(((int)val));
    Console.WriteLine(val);
}

出力

one
1
1  
max
2147483647
2147483647    
min
-2147483648
-2147483648    

免責条項: longを基にしたenumでは機能しません


これを行うには、定義された列挙型に拡張メソッドを実装します。

public static class MyExtensions
{
    public static int getNumberValue(this Question questionThis)
    {
        return (int)questionThis;
    }
}

これは現在のenum値のint値を簡単に取得します:

Question question = Question.Role;
int value = question.getNumberValue();

または

int value = Question.Role.getNumberValue();

これを試して :

int value = YourEnum.ToString("D");

もう1つの方法:

Console.WriteLine("Name: {0}, Value: {0:D}", Question.Role);

結果:

Name: Role, Value: 2

パブリック定数を持つ静的クラスとして宣言します。

public static class Question
{
    public const int Role = 2;
    public const int ProjectFunding = 3;
    public const int TotalEmployee = 4;
    public const int NumberOfServers = 5;
    public const int TopBusinessConcern = 6;
}

そして、あなたはQuestion.Roleとしてそれを参照することができます。そして、それは常にintまたはあなたがそれを定義するものとして評価されます。


以下は拡張メソッドです

public static string ToEnumString<TEnum>(this int enumValue)
        {
            var enumString = enumValue.ToString();
            if (Enum.IsDefined(typeof(TEnum), enumValue))
            {
                enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString();
            }
            return enumString;
        }

例:

Public Enum EmpNo
{
    Raj = 1
    Rahul,
    Priyanka
}

そして、enum値を得るためのコードの中で:

int setempNo = (int)EmpNo.Raj; //This will give setempNo = 1

または

int setempNo = (int)EmpNo.Rahul; //This will give setempNo = 2

列挙型は1ずつ増加し、開始値を設定できます。 そうでなければ、当初は0として割り当てられます。


列挙型は複数のプリミティブ型で宣言できるため、任意の列挙型をキャストする汎用拡張メソッドが便利です。

        enum Box
        {
            HEIGHT,
            WIDTH,
            DEPTH
        }

        public static void UseEnum()
        {
            int height = Box.HEIGHT.GetEnumValue<int>();
            int width = Box.WIDTH.GetEnumValue<int>();
            int depth = Box.DEPTH.GetEnumValue<int>();
        }

        public static T GetEnumValue<T>(this object e) => (T)e;

列挙型をキャストするだけです。

int something = (int) Question.Role;

enumのデフォルトの基底型はintなので、上記は野生で見られる大部分のenumに対して機能します。

しかし、 cecilphillip指摘しているように、列挙型には異なる基底型がある可能性があります。 列挙型がuintlong 、またはulongとして宣言されている場合は、その列挙型の型にキャストする必要があります。 例えば

enum StarsInMilkyWay:long {Sun = 1, V645Centauri = 2 .. Wolf424B = 2147483649};

あなたが使用する必要があります

long something = (long)StarsInMilkyWay.Wolf424B;

私が考えることができる最も簡単な解決策は、次のようにGet(int)メソッドをオーバーロードすることGet(int)

[modifiers] Questions Get(Question q)
{
    return Get((int)q);
}

ここで、 [modifiers]は一般にGet(int)メソッドと同じです。 Questionsクラスを編集できない、あるいは何らかの理由でしたくない場合は、拡張機能を作成してメソッドをオーバーロードすることができます:

public static class Extensions
{
    public static Questions Get(this Questions qs, Question q)
    {
        return qs.Get((int)q);
    }
}

私は最近、保護されたコンストラクタと事前定義された静的インスタンス(Roelof - C#Valid Enum Values - Futureproofメソッドのおかげで)を持つクラスを使用する代わりに、自分のコードでenumを使用することに変わりました

その点を踏まえ、この問題に私がどのように近づいていくかを以下に説明します(暗黙のintへの変換を含む)。

public class Question
{
    // Attributes
    protected int index;
    protected string name;
    // Go with a dictionary to enforce unique index
    //protected static readonly ICollection<Question> values = new Collection<Question>();
    protected static readonly IDictionary<int,Question> values = new Dictionary<int,Question>();

    // Define the "enum" values
    public static readonly Question Role = new Question(2,"Role");
    public static readonly Question ProjectFunding = new Question(3, "Project Funding");
    public static readonly Question TotalEmployee = new Question(4, "Total Employee");
    public static readonly Question NumberOfServers = new Question(5, "Number of Servers");
    public static readonly Question TopBusinessConcern = new Question(6, "Top Business Concern");

    // Constructors
    protected Question(int index, string name)
    {
        this.index = index;
        this.name = name;
        values.Add(index, this);
    }

    // Easy int conversion
    public static implicit operator int(Question question) =>
        question.index; //nb: if question is null this will return a null pointer exception

    public static implicit operator Question(int index) =>        
        values.TryGetValue(index, out var question) ? question : null;

    // Easy string conversion (also update ToString for the same effect)
    public override string ToString() =>
        this.name;

    public static implicit operator string(Question question) =>
        question?.ToString();

    public static implicit operator Question(string name) =>
        name == null ? null : values.Values.FirstOrDefault(item => name.Equals(item.name, StringComparison.CurrentCultureIgnoreCase));


    // If you specifically want a Get(int x) function (though not required given the implicit converstion)
    public Question Get(int foo) =>
        foo; //(implicit conversion will take care of the conversion for you)
}

このアプローチの利点は、列挙から得られるすべてのものを得ることですが、コードはより柔軟になりました。したがって、 Questionの値に基づいて異なるアクションを実行する必要がある場合は、ロジックをQuestion自体に入れることができますそれぞれのシナリオに取り組むためにコード全体に大量のケースステートメントを置くのではなく)

注:C#6の機能を利用するために、2018-04-27が更新されました。 つまり、宣言式とラムダ式本体の定義です。 元のコードのリビジョン履歴を参照してください。 これは、定義を少し冗長にする利点があります。 この答えの主な苦情の1つでした。


Question question = Question.Role;
int value = (int) question;

value == 2ます。


int number = Question.Role.GetHashCode();

numberは値2を持つ必要があります。


public enum Suit : int
{
    Spades = 0,
    Hearts = 1,
    Clubs = 2,
    Diamonds = 3
}

Console.WriteLine((int)(Suit)Enum.Parse(typeof(Suit), "Clubs"));

//from int
Console.WriteLine((Suit)1);

//From number you can also
Console.WriteLine((Suit)Enum.ToObject(typeof(Suit), 1));

if (typeof(Suit).IsEnumDefined("Spades"))
{
    var res = (int)(Suit)Enum.Parse(typeof(Suit), "Spades");
    Console.Out.WriteLine("{0}", res);
}




int