質問編集履歴
2
状況の詳細説明を追加。
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
|
-
|
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のプロパティの話を追記
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
|
|