0

私は次の列挙型を持っています:

[Flags]
public enum PostAssociations
{
    None = 0x0,
    User = 0x1,
    Comments = 0x2,
    CommentsUser = 0x3
}

出発点として、これらのフラグが正しいかどうかはわかりません。

これを行っているのは、Entity Framework の "Includes" を定義する流暢な方法があるためです (EF Include メソッドは文字列を受け取るため、UI に公開したくないため)。

サービス層がPostAssociationsを受け入れることができるようにしたいので、サービス層では拡張メソッドを利用してこれを文字列[]に変換します。(私のリポジトリは、.Include を実行するために分割されます)。

私は Flags Enum をあまり使っていないので、無知で申し訳ありません。:)

これは私が欲しいものの「真理値表」です (列挙値、変換された文字列[])

None = null
User = new string[] { "User" }
Comments = new string[] { "Comments" }
User, Comments = new string[] { "User", "Comments" }
Comments, CommentsUser = new string[] { "Comments", "Comments.User" }
User, Comments, CommentsUser = new string[] { "User", "Comments", "Comments.User" }

コメントなしで CommentsUser を持つことはできません。

だから私は3つのことで助けが必要です:

  1. その真理値表に一致するように列挙型を設定する方法は?
  2. これらの例の 1 つのサービス層を呼び出すにはどうすればよいですか?
  3. その列挙型を文字列配列に変換する拡張メソッドを作成するにはどうすればよいですか?

もちろん、私がやろうとしていることを行うためのより良い方法を皆さんが考えることができれば、それも検討します. 基本的に、列挙型の背後にある EF インクルードの「魔法の文字列」をマスクしようとしています。

みんなありがとう。

4

2 に答える 2

2

フラグを使用して列挙型を作成した場合:

[Flags]
public enum PostAssociations
{    
    None = 0x0,
    User = 0x1,
    Comments = 0x2,
    CommentsUser = User|Comments,
}

それはもっと理にかなっているでしょう。あなたの現在のコードでは、私はあなたが何を達成しようとしているのか理解していません。

そうでなければ、フラグベースの列挙型はまったく必要ないと思います...

于 2010-10-06T00:25:57.570 に答える
0

私の悪者、フラグ列挙型の経験が浅いため、紛らわしい質問になりました。

私のシナリオは flags 列挙型には有効ではありません。

代わりに、PostAssociations[] を使用することにしました。

私のサービス層:

public Post FindSingle(int postId, PostAssociations[] postAssociations)
{
   return repo.Find(postAssocations.ToEfInclude()).WithId(postId);
}

拡張方法:

public static string[] ToEfInclude(this PostAssociations[] postAssocations)
{
    if (postAssocations == null) return null;

    List<string> includeAssociations = new List<string>();

    if (postAssocations.Contains(PostAssociations.User))
        includeAssociations.Add("User");
    if (postAssocations.Contains(PostAssociations.Comments))
    {
        if (postAssocations.Contains(PostAssociations.CommentsUser))
        {
            includeAssociations.Add("Comments.User");   
        }

        includeAssociations.Add("Comments");
    }

    return includeAssociations.ToArray();
}

使用法:

PostAssociations[] associations = new[] { PostAssociations.Comments, PostAssociations.User, PostAssociations.CommentsUser };    
return service.Find(1, associations);
于 2010-10-06T00:34:35.380 に答える