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