質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

4026閲覧

Enum型のリフレクションでEnum名と列挙名を取り出したい

kazuya_

総合スコア78

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/09/10 00:00

下記で、td.Noneのように使用できるように割り当てられるでしょうか?
Enumで取り出し、tostring()で列挙名自体は取り出せています。
(この方法でなく、直接割り当てる方法)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Enumrefrection { class Program { static void Main(string[] args) { test t1 = new test(15); // Type ty = Type.GetType("Enumrefrection.test+Status"); //var tg = ty.GetField("Status", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); Type ty = t1.GetType(); var tg = ty.GetField("Enumrefrection.test+Status", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); var td = (Enum)tg.GetValue(t1); // td.Noneのように使用したい } } class test { private enum Status { None = 0, Rnu, Stop }; private int S1 = 0; public test(int s) { S1 = s; } } } コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1016

2017/09/10 19:19 編集

やりたいことが読めないのと、提示されたソースにノイズが多いので予測もしづらいです。 関係ないメンバー変数とかコンストラクタのパラメータとか極力除去して単純な形でソースを提示してください。あといらないコードは消してください。完結に何がしたいのか書いてください。
guest

回答2

0

意図が読めませんが、、、
コンストラクタで受け取ったときに、キャストするだけではダメなのでしょうか?

c#

1  class Test 2 { 3 private enum TestStatus 4 { 5 None = 0, 6 Run, 7 Stop 8 }; 9 10 TestStatus Status { get; set; } 11 12 // What is Test. 13 Test(int s) 14 { 15 // キャストするだけ 16 this.Status = (TestStatus)s; 17 } 18 19 Test(TestStatus status) 20 { 21 // こっちのがわかりやすい??? 22 this.Status = status; 23 } 24 }

PS.
リフレクションを使うのはできるだけ、避けた方がいいです。
15を渡すとNoneになる理由もよくわかりませんが、
そういったルール等は呼び出し側でやるのではなく、Test(呼ばれる側)でやってください。
c#をはじめとして、オブジェクト指向言語は呼び出す人と呼ばれる人はが違う人が作るかも、と考えるといいと思います。

投稿2017/09/10 18:30

編集2017/09/10 19:39
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

// td.Noneのように使用したい
と言っている時点で型が解決されているので、リフレクションで何をしたいのかやりたいことが推測できません。


tdがTest.Status型であることをインテリセンスが理解した状態でプログラミングをしたいということでしょうか。
リフレクションを使った場合、ランタイムで型を解決する必要があるのでインテリセンスは使えないと思います。


または、td.Noneというソースコードを書いた状態でビルドを通したいということでしょうか。
これもビルド時点で型が解決できていないとビルドは通りません。


StatusがprivateなのでTest.Statusという型で外から見えないので、リフレクションで処理したいということでしょうか。

そのStatusを持っているメンバ変数に対してリフレクションで処理をするのであればそのメンバ変数が記述されているソースを提示してください。

投稿2017/09/10 19:34

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問