teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

文章修正

2020/03/14 15:28

投稿

ZheZephyrz
ZheZephyrz

スコア11

title CHANGED
File without changes
body CHANGED
@@ -64,6 +64,7 @@
64
64
  /// stringをジェネリクスでもらったタイプのEnumにする
65
65
  /// </summary>
66
66
  public T GetEnumTypeFromString<T>(T t, string str) where T : struct {
67
+      // enumの種類の確認用
67
68
  Type tempType = t.GetType();
68
69
  Debug.Log(tempType);
69
70
 

4

コードの改善

2020/03/14 15:28

投稿

ZheZephyrz
ZheZephyrz

スコア11

title CHANGED
File without changes
body CHANGED
@@ -49,21 +49,21 @@
49
49
  void Start() {
50
50
  // 文字列を引数で渡した種類のEnumに変換
51
51
  string day = "friday";
52
- dayType = GetEnumTypeFromString<DAY_TYPE>(dayType, day);
52
+ dayType = GetEnumTypeFromString(dayType, day);
53
53
 
54
54
  // 配列の場合
55
55
  string timeArray = "night,afternoon,morning";
56
56
  string[] strArray = timeArray.Split(',').ToArray();
57
57
  timeTypeArray = new TIME_TYPE[strArray.Length];
58
58
  for (int i = 0; i < strArray.Length; i++) {
59
- timeTypeArray[i] = GetEnumTypeFromString<TIME_TYPE>(timeType, strArray[i]);
59
+ timeTypeArray[i] = GetEnumTypeFromString(timeType, strArray[i]);
60
60
  }
61
61
  }
62
62
 
63
63
  /// <summary>
64
64
  /// stringをジェネリクスでもらったタイプのEnumにする
65
65
  /// </summary>
66
- public T GetEnumTypeFromString<T>(Enum t, string str) where T : struct {
66
+ public T GetEnumTypeFromString<T>(T t, string str) where T : struct {
67
67
  Type tempType = t.GetType();
68
68
  Debug.Log(tempType);
69
69
 
@@ -118,5 +118,4 @@
118
118
  }
119
119
  ```
120
120
  こちらをどのように修正したらよいのか、わからずにおります。
121
- またこちらのメソッドの呼び出し側も型引数の指定が必要なのですが、さすがにそれを省略する方法はないものでしょうか。
122
121
  何卒よろしくお願い致します。

3

文章修正

2020/03/14 15:26

投稿

ZheZephyrz
ZheZephyrz

スコア11

title CHANGED
File without changes
body CHANGED
@@ -43,10 +43,7 @@
43
43
  FUTURE
44
44
  }
45
45
 
46
- public TIME_TYPE timeType;
47
46
  public DAY_TYPE dayType;
48
- public SERIES_TYPE seriesType;
49
-
50
47
  public TIME_TYPE[] timeTypeArray;
51
48
 
52
49
  void Start() {
@@ -121,5 +118,5 @@
121
118
  }
122
119
  ```
123
120
  こちらをどのように修正したらよいのか、わからずにおります。
124
- またこちらのメソッドの呼び出し側もキャストが必要なため、Enum.Parseを使う場合とあまり処理変わらず、そこも修正したいで
121
+ またこちらのメソッドの呼び出し側も型引数の指定が必要なのですが、さすがにれを省略する方法はなものしょうか
125
122
  何卒よろしくお願い致します。

2

コードの改善

2020/03/14 15:25

投稿

ZheZephyrz
ZheZephyrz

スコア11

title CHANGED
File without changes
body CHANGED
@@ -43,53 +43,54 @@
43
43
  FUTURE
44
44
  }
45
45
 
46
+ public TIME_TYPE timeType;
46
47
  public DAY_TYPE dayType;
48
+ public SERIES_TYPE seriesType;
49
+
47
50
  public TIME_TYPE[] timeTypeArray;
48
51
 
49
52
  void Start() {
50
-      // 文字列を引数で渡した種類のEnumに変換
53
+ // 文字列を引数で渡した種類のEnumに変換
51
54
  string day = "friday";
52
- dayType = (DAY_TYPE)GetEnumTypeFromString(dayType, day);
55
+ dayType = GetEnumTypeFromString<DAY_TYPE>(dayType, day);
53
56
 
54
57
  // 配列の場合
55
58
  string timeArray = "night,afternoon,morning";
56
59
  string[] strArray = timeArray.Split(',').ToArray();
57
60
  timeTypeArray = new TIME_TYPE[strArray.Length];
58
61
  for (int i = 0; i < strArray.Length; i++) {
59
- timeTypeArray[i] = (TIME_TYPE)GetEnumTypeFromString(timeType, strArray[i]);
62
+ timeTypeArray[i] = GetEnumTypeFromString<TIME_TYPE>(timeType, strArray[i]);
60
63
  }
61
64
  }
62
65
 
63
66
  /// <summary>
64
- /// stringをジェネリクスでもらったタイプのEnumにして戻
67
+ /// stringをジェネリクスでもらったタイプのEnumにす
65
68
  /// </summary>
66
- public Enum GetEnumTypeFromString<T>(T t, string str) where T : struct {
69
+ public T GetEnumTypeFromString<T>(Enum t, string str) where T : struct {
67
- // 引数の確認用
68
70
  Type tempType = t.GetType();
69
71
  Debug.Log(tempType);
70
72
 
71
73
  Type type = typeof(T);
72
74
  if (!type.IsEnum) {
73
- // enumでなければ処理しない
74
75
  Debug.Log("Not Enum");
75
76
  } else {
76
- // 引数のenumの種類によって分岐。ここを1つの処理に統一したいです。
77
77
  if (type == typeof(TIME_TYPE)) {
78
78
  TIME_TYPE temp = (TIME_TYPE)Enum.Parse(typeof(TIME_TYPE), str, true);
79
- return temp;
79
+ return (T)(object)temp;
80
80
  }
81
81
  if (type == typeof(DAY_TYPE)) {
82
82
  DAY_TYPE temp = (DAY_TYPE)Enum.Parse(typeof(DAY_TYPE), str, true);
83
- return temp;
83
+ return (T)(object)temp;
84
84
  }
85
85
  if (type == typeof(SERIES_TYPE)) {
86
86
  SERIES_TYPE temp = (SERIES_TYPE)Enum.Parse(typeof(SERIES_TYPE), str, true);
87
- return temp;
87
+ return (T)(object)temp;
88
88
  }
89
89
  }
90
- return TIME_TYPE.AFTERNOON;
90
+ return (T)(object)TIME_TYPE.AFTERNOON;
91
91
  }
92
92
  }
93
+
93
94
  ```
94
95
 
95
96
  ### 試したこと
@@ -108,15 +109,15 @@
108
109
  ```
109
110
  if (type == typeof(TIME_TYPE)) {
110
111
  TIME_TYPE temp = (TIME_TYPE)Enum.Parse(typeof(TIME_TYPE), str, true);
111
- return temp;
112
+ return (T)(object)temp;
112
113
  }
113
114
  if (type == typeof(DAY_TYPE)) {
114
115
  DAY_TYPE temp = (DAY_TYPE)Enum.Parse(typeof(DAY_TYPE), str, true);
115
- return temp;
116
+ return (T)(object)temp;
116
117
  }
117
118
  if (type == typeof(SERIES_TYPE)) {
118
119
  SERIES_TYPE temp = (SERIES_TYPE)Enum.Parse(typeof(SERIES_TYPE), str, true);
119
- return temp;
120
+ return (T)(object)temp;
120
121
  }
121
122
  ```
122
123
  こちらをどのように修正したらよいのか、わからずにおります。

1

書式の修正

2020/03/14 15:22

投稿

ZheZephyrz
ZheZephyrz

スコア11

title CHANGED
File without changes
body CHANGED
@@ -5,6 +5,7 @@
5
5
   enumの種類が増えてきたため、ジェネリクスを使用したメソッドを作ってenumの種類によって分岐し、対象の文字列をenumにして戻す処理を作りました。
6
6
   このとき、enumの種類分だけif文による分岐を作成しているため、せっかくジェネリクスの形でenumを引数にもらっているのに非常に屈託な書式になってしまいました。
7
7
   ジェネリクスを使って、分岐を作らずに引数よりenumを特定した1つの処理を作ることはできるのでしょうか。
8
+ またメソッドの呼び出しもキャストが必要なため、こちらも屈託です。
8
9
  ご教示いただけますようお願い申し上げます。
9
10
 
10
11
  エラーメッセージはありませんが、全体の処理も見て頂いて問題点があるようでしたらご教示頂けますと幸いです。
@@ -119,4 +120,5 @@
119
120
  }
120
121
  ```
121
122
  こちらをどのように修正したらよいのか、わからずにおります。
123
+ またこちらのメソッドの呼び出し側もキャストが必要なため、Enum.Parseを使う場合とあまり処理が変わらず、そこも修正したいです。
122
124
  何卒よろしくお願い致します。