質問編集履歴

2

状況の詳細説明を追加。

2020/09/07 04:04

投稿

ttact
ttact

スコア170

test CHANGED
File without changes
test CHANGED
@@ -1,22 +1,44 @@
1
1
  ■課題
2
2
 
3
- C#ソースコードを解析し、enumとそれに含まれる列挙子を抽出するプログラムを書いています。
3
+ Roslyn(Microsoft.CodeAnalysis)を使ってC#ソースコードを解析し、enumとそれに含まれる列挙子を抽出するプログラムを書いています。
4
-
5
- コード上の定義として「列挙子シンボル = 値,」の形式で記述しているケースでは、EnumDeclarationSyntax.EqualsValueによって「 = 値」の部分を取得できますが、「列挙子シンボル,」の形式で記述しているケースで値を取得する場合はどうしたらよいのでしょうか。
6
4
 
7
5
 
8
6
 
9
- SemanticModel.GetConstantValue()使ってみたのでが、残念ながらnullが返っます。
7
+ 各列挙子の値について、簡単かつRoslynが算出した値取得る手段を探します。
10
-
11
- [9/7 11:53追加編集ここから]
12
-
13
- semanticModel.GetDeclaredSymbol(memberSyntaxTree);で戻ってくるIFieldSymbolにはConstantValueというプロパティもあるのですが、これもnullになってます。
14
-
15
- [9/7 11:53追加編集ここまで]
16
8
 
17
9
 
18
10
 
11
+ ■試したこと
12
+
13
+ 以下のI/Fはダメでした:
14
+
15
+ - SemanticModel.GetConstantValue()は、nullが返る。
16
+
17
+ - SemanticModel.GetDeclaredSymbol();で戻ってくるIFieldSymbolのConstantValueには、nullが入っている。
18
+
19
+
20
+
21
+ ■回避策
22
+
23
+ 以下は対応アイディアとして検討していますが、さらに楽な手段がないか探しています。
24
+
25
+
26
+
27
+ (1)
28
+
29
+ 「列挙子シンボル = 値,」の形式で記述しているケースでは、EnumDeclarationSyntax.EqualsValueによって「 = 値」の部分を取得できます。なので本文字列をパースして自前で算出すれば値は得られます。
30
+
31
+ これを避けているのは、Roslynは元々コンパイラで、アセンブリを生成する過程では同様にパース・値算出を行っているはずです。
32
+
33
+ 車輪の再発明をしたくない(結果を食い違いさせたくない)ですし、I/Fが提供されているなら自作は避けたいです。
34
+
35
+
36
+
37
+ (2)
38
+
19
- CSharpCompilation.Emit()によってメモリ上でビルドして、得たアセンブリをリフレクションで解析する方法を思いついたのですが、他にもっと楽な方法がないかと思い、質問します
39
+ CSharpCompilation.Emit()によってメモリ上でビルドして、得たアセンブリをリフレクションで解析する。
40
+
41
+ これを避けているのは、単に手間がかかるからです。Roslynの算出結果を利用しているという点では要求を満たします。
20
42
 
21
43
 
22
44
 
@@ -56,7 +78,7 @@
56
78
 
57
79
 
58
80
 
59
- // ダメなコード。
81
+ // ダメなコードの例
60
82
 
61
83
  var value = semanticModel.GetConstantValue(memberSyntaxTree);
62
84
 

1

質問の課題について、IFieldSymbolのプロパティの話を追記

2020/09/07 04:04

投稿

ttact
ttact

スコア170

test CHANGED
File without changes
test CHANGED
@@ -7,6 +7,12 @@
7
7
 
8
8
 
9
9
  SemanticModel.GetConstantValue()を使ってみたのですが、残念ながらnullが返ってきます。
10
+
11
+ [9/7 11:53追加編集ここから]
12
+
13
+ semanticModel.GetDeclaredSymbol(memberSyntaxTree);で戻ってくるIFieldSymbolにはConstantValueというプロパティもあるのですが、これもnullになってます。
14
+
15
+ [9/7 11:53追加編集ここまで]
10
16
 
11
17
 
12
18