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

質問編集履歴

2

状況の詳細説明を追加。

2020/09/07 04:04

投稿

ttact
ttact

スコア171

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
- SemanticModel.GetConstantValue()を使ってみたですが残念ならnullが返っます。
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
- CSharpCompilation.Emit()によってメモリ上でビルドして、得たアセンブリをリフレクションで解析す方法を思いついたですが、他もっと楽な方法かと思い、質問します
9
+ - SemanticModel.GetDeclaredSymbol();で戻ってIFieldSymbolConstantValueは、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のプロパティの話を追記

2020/09/07 04:04

投稿

ttact
ttact

スコア171

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