2011-12-05 17 views
3

だから、私はそれが可能なように感じるが、私は一緒にそれを置くチョップを持っていない。ルックアップテーブル(IDと名前フィールド)があります。私はルックアップと同期して列挙します。私が望むのは、SQLテーブルのリストを作成して、roslynがコンパイル中/コンパイル前にenumを作成するようにすることです。私の列挙型は常に同期していることを知っているこの方法で、それは私のプレートからもう一つのものです。列挙型を生成できますか?

誰かが私に道を見せたり、なぜそれが悪い考えになるか教えてもらえますか?私は解決策が本当に多くのコードではないように感じます...

ありがとう!

+0

のと同じことを達成するために、サンプルコードの 新しいセット。私には普通のコード生成のように聞こえる。 –

答えて

6

これは、roslynで列挙型を作成する方法です。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var member1 = Syntax.EnumMemberDeclaration(
      identifier: Syntax.Identifier("Member1") 
      ); 

     var declaration = Syntax.EnumDeclaration(
      identifier: Syntax.Identifier("MyEnum"), 
      modifiers: Syntax.TokenList(Syntax.Token(SyntaxKind.PublicKeyword)), 
      members: Syntax.SeparatedList(member1) 
      ); 

     Console.WriteLine(declaration.Format()); 
     Console.ReadLine(); 
    } 
} 

これが返されます。これはあなたが本当に必要なものであれば

public enum MyEnum 
{ 
    Member1 
} 

を今すぐあなたの質問に、私は知りません。

まず、プリコンパイル時にこれを行うための機能はまだ組み込まれていないと思うので、コンソールEXEを作成してプリビルドイベントで呼び出す必要があります。

この時点では、これらのテーブルが頻繁に変更されない限り、コード生成を使用して手動で行うほうがよいでしょう。

アンあなたが本当にあなたのためにそれを行うにはロスリン必要はありません。このような場合には、あなただけの任意のコード生成ソフトウェアでそれを吐き出す、または独自のロールすることができます...ここで

+0

これは私の頭が良いスタートだと思います。私は文法がきれいであるのが好きです。私はこれについて実際に解説し、私が望むものを作り出すことができた、と私は信じている。これにはすでに何かがあるというコンセンサスがありますか?私はあなたが私の将来のすべてのプロジェクトで使用するツールの途中で私を怒らせたように感じます... – abend

+1

あなたが達成したいことに依存します。職場では、SqlServer管理ライブラリといくつかのテンプレートを使用してenumを生成し、拡張するテーブルを表す不変クラスを作成することで、(プレビルドイベントではないが)言及したことを行う。さて、それは新しい技術で遊ぶほど面白くないので、もしあなたの目標がローズリンを学び、それを楽しみたいならば、私は先に進むと言うでしょう! –

+0

私が言いたいことは忘れていましたが、おそらくすでにロサンゼルスがCTPであり、今後のリリースで変更される可能性があります。 *実際の生活でこれを使用する場合は、心に留めてください –

1

がために更新され、いくつかのコードですRoslynの現在のバージョンであり、列挙型アイテムに属性と値を追加しています。

 public EnumDeclarationSyntax GenerateEnum() 
    { 
     var loanPurpose = new[] 
     { 
      "Business Launching", 
      "HomePurchase", 
      "HomeImprovement" 

     }; 
     var enumDescriptions = new[] 
     { 
      "Launch a new business", 
      "Buy a home", 
      "Make home improvements" 
     }; 
     var i = 0; 
     var members = new List<EnumMemberDeclarationSyntax>(); 
     foreach (var item in loanPurpose) 
     { 
      var attribute = SyntaxFactory.Attribute(
       SyntaxFactory.IdentifierName("Description")); 
      var attributeArgument = SyntaxFactory.AttributeArgument(
       SyntaxFactory.LiteralExpression(
        SyntaxKind.StringLiteralExpression, 
        SyntaxFactory.Literal(enumDescriptions[i ]))); 
      attribute = attribute.WithArgumentList(
       SyntaxFactory.AttributeArgumentList(
        SyntaxFactory.SingletonSeparatedList(attributeArgument))); 
      var attributes = SyntaxFactory.SingletonList(
       SyntaxFactory.AttributeList(SyntaxFactory 
        .SingletonSeparatedList(attribute))); 
      var objectCreationExpression = SyntaxFactory.EqualsValueClause(
       SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, 
        SyntaxFactory.Literal(i))); 
      var member = SyntaxFactory.EnumMemberDeclaration(attributes, 
       SyntaxFactory.Identifier(item), 
       objectCreationExpression); 
      members.Add(member); 
      i++; 
     } 
     var declaration = SyntaxFactory.EnumDeclaration 
      (new SyntaxList<AttributeListSyntax>(), 
      baseList: null, 
      identifier: SyntaxFactory.Identifier("LoanPurpose"), 
      modifiers: SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword)), 
      members: SyntaxFactory.SeparatedList(members) 
      ); 
     return declaration; 
    } 

属性を追加する構文は少し厄介ですが、私はしばしばいくつかの属性を追加する必要があることがわかります。ルックアップテーブルの属性と値のデータは、すでにコード生成を実行している可能性があります。

0

6年前にセバスチャンによって提供された回答は、おそらく以前は動作していましたが、もはやそれはありません。私が正しくあなたを理解していれば、あなたもロズリンを使用せずにこれを行うことができ18/12/2017

EnumMemberDeclarationSyntax member1 = EnumMemberDeclaration(identifier: Identifier("Member1")); 

var members =new SyntaxNodeOrToken[]{member1}; 

var declaration = EnumDeclaration(
      identifier: Identifier("MyEnum")).WithMembers(
      members: SeparatedList< EnumMemberDeclarationSyntax>(members)); 
関連する問題