2010-12-30 9 views
0

は私が(myString)値の文字列を持っている私の溶液中で別のクラスからキャスト文字列値は

public enum Days{Mon, Tue, Wed} 

を持つクラスMyClass、その後、フィールド

public Days dayOfWeek; 

を持っています0,1または2のいずれかです。私は

myClassInstance.dayOfWeek = Convert.ToInt32(myString) 

myClassInstance.dayOfWeek = (int) myString 
を試してみました

... 1は火を意味し、0は月を意味myStringvalueようにdayOfWeek等しい(myClassInstanceと呼ばれる)MyClass年代フィールドのインスタンスを設定したいです

でもどちらも動作しません。私はこれが簡単だと確信しています。これらのテクニックはなぜ機能しないのですか?

+2

動作するはずです "これらの技術が動作しないのはなぜか?"列挙型はintではないためです。 enum値をintの値と同じに設定することはできません。 –

+1

日の列挙型の代わりにDayOfWeekを使用します。詳細はこちら - > http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx –

答えて

9

正常sDaysのインスタンスに解析できない場合を扱うために

string s = "0"; 
Days day = (Days)Enum.Parse(typeof(Days), s); 

又は

string s = "0"; 
Days day; 
if(!Enum.TryParse(s, out day)) { 
    // error handling 
} 

を試してみてください。

これは

を述べEnum.Parseのドキュメントごとに作品が名または同等の列挙オブジェクトへの一つ以上の列挙定数の数値の文字列表現に変換します。 stringのインスタンスが実際に

経由列挙型で定義された値を表す場合

さらに、次のことが確認でき

string s = "3"; 
bool defined = Enum.IsDefined(typeof(Days), s); 
// defined is false 

Enum.Parse盲目的にそれが値を表していないにも関わらず、この場合にはsを解析しますenum Daysによって定義され、Enum.ParseからDaysの結果からのキャストは失敗しません。

また、曜日を表す組み込みのenumがあります。この列挙型はSystem.DayOfWeekです。私はこれを使用することをお勧めします。最後に

、あなたがSystem.DayOfWeekを使用することはできません何らかの理由で、あなたは最低でDayの代わりに、Days(複数形を削除する)にあなたの列挙型の名前を変更する必要があります。フラグを表すenumだけが複数形にされるべきです。上記の変数dayは1日を表し、日数を表していないことに注意してください。このため、列挙型の名前をDayに変更する必要があります。これは、ほとんどのC#および.NETプログラマが使用するnaming conventionsと一貫しています。

+0

こんにちは、あなたは正しいと思います。しかし、複数のフラグについて知りませんでした。フラグはオーバーフロー、ゼロ、キャリー、ネガティブなどのコレクションになりますが、executeFlagsのようにそれをsomethignと呼びます。とにかくこれは私が実際に実装しているenumの実際の名前ではありません...私はGenericという質問をしました。私が持っている問題は、enumが別のクラスにあることです。アクセス修飾子をpublicに設定しているにもかかわらず、呼び出し側クラスからのアクセスが見えません。つまり、私はmyClassInstance.Days dayOfWeekを持つことができません。それはMyClassの外からこれを宣言することはできません。どうして? – Prof

+0

私はそれが働いている...私はちょうどそれのインスタンスではないMyClass.Daysを使用しました! – Prof

6
あなたはそれを変換した後 Days列挙型に intをキャストする必要があり

myClassInstance.dayOfWeek = (Days)Convert.ToInt32(myString); 

Enum.TryParse(.NET 4の場合)またはを使用することもできます。受信データの信頼度に応じて、Enum.IsDefinedを呼び出して、整数が有効な値のDaysであることを確認することもできます(そうでない場合は、これらのすべてのケースでは、Daysのインスタンスはありません)。名前付きの値のいずれかに対応します)。また

Days dayOfWeek; 
if (!Enum.TryParse(myString, out dayOfWeek)) { 
    dayOfWeek = Days.Mon; // or some other default, or throw 
} 

myClassInstance.dayOfWeek = dayOfWeek; 

それとも

myClassInstance.dayOfWeek = (Days)Enum.Parse(typeof(Days), myString); 

、他の人が言及したように、それはあなたが本当に欲しいものと一致した場合、あなたは、代わりにカスタムバージョンのビルトインDayOfWeek列挙型を使用して検討する必要があります。

また、他の人がもう一度言及したように、は、Flags列挙型ではないため、.NET命名ガイドラインに基づくより良い名前です。

+0

私は.net 3.5用に開発しています。アクセス修飾子をpublicに設定していても、myClassInstanceの列挙型にアクセスできないため、(Days)にキャストできません。 – Prof

+0

これを 'MyClass'の中で定義した場合は、' MyClass 'を使う必要があります。「MyClass」の外でそれを参照するための日です。 – bdukes

2

試してみてください。

Days d = (Days)Enum.Parse(typeof(Days), myString); 

より完全な例はhereです。

+1

これは、myString == "Mon"や "Tues"などの場合にのみ有効です。 – bendewey

+0

http://msdn.microsoft.com/en-us/library/essfb559.aspx docs私は間違っていると言っています値 " – bendewey

+0

いいえ、整数にも有効です。少なくとも、私のテストではそうです。 –

0

あなたはDaysintをキャストする必要があります:あなたが何をしたいか

myClassInstance.dayOfWeek = (Days)Convert.ToInt32(myString); 
0

はint型に文字列をキャスト(またはあなたが素敵な方法でそれをしたい場合はtryparse)である

次に、次のコードを使用してenum値を設定します。

(日)Enum.ToObject(typeof(Days)、intValue);

0

これは

myClassInstance.dayOfWeek = Enum.Parse(typeof(Days), myString); 

Enump.Parse

+0

問題は、Daysの定義がMyClass内に格納されており、アクセスすることができないということです。私の定義は公の列挙日であるにもかかわらず、{月、火、水}の日です。パブリックの後に静的修飾子を置くと別のクラスでもアクセスできますが、私のプログラムはコンパイルされません。私はMyClassに静的なものを置くことができません。 – Prof

+0

私はそれを動作させました...私はMyClass.Daysをインスタンスそれの! – Prof

関連する問題