2

次のコードを作成しました。

var header = "Entity Validation Error";
var detail = < I want to have a list that contains the title and errors list here>
foreach (var eve in ex.EntityValidationErrors)
{
    var title = string.Format("Entity of type \"{0}\" in state \"{1}\"
                has the following validation errors:",
        eve.Entry.Entity.GetType().Name, eve.Entry.State);
    System.Diagnostics.Debug.WriteLine(title);
    var errors = new List<string>();
    foreach (var ve in eve.ValidationErrors)
    {
        var error = string.Format("- Property: \"{0}\", Error: \"{1}\"",
            ve.PropertyName, ve.ErrorMessage);
        errors.Add(error);
        System.Diagnostics.Debug.WriteLine(error);
    }
}
return Request.CreateErrorResponse(HttpStatusCode.Conflict, 
         < I want to return the header and detail as an anonymous object >);

エンティティの各エラーを調べ、デバッグ メッセージを出力し、タイトルと詳細のリストを作成します。

変数のタイトルとエラーを匿名オブジェクトとして取得し、これをリストに入れて返すことができるようにするにはどうすればよいですか?

4

5 に答える 5

6

匿名オブジェクトを含む C# でリストを作成するにはどうすればよいですか?

まあ、1 つの怠惰な方法は: as object:

var list = new List<object>();
//...
list.Add(new { Foo = 123, Bar = "abc" });

しかし、それはあまり役に立ちません。したがって、おそらく問題は「匿名型によって型指定されたリストを作成する方法」です。少しトリッキー-インスタンスを使用して、コンパイラに T を注入するよう説得する必要があります。

var list = Enumerable.Repeat(new { Foo = 123, Bar = "abc" }, 0).ToList();
//...
list.Add(new { Foo = 456, Bar = "def" });

(一番上の行のリストは空であることに注意してください。その偽のインスタンスはコンパイラの単なるテンプレートです)

しかし、繰り返しますが、これはまだローカルに保つのが最善です。それからあなたは「私は帰りたい」と言います-今、それが本当に問題になるところがあります. 基本的に、入力して返すことはできません。object、または非ジェネリックを返すことができますがIList、匿名型として返すことはできないため、呼び出し元には何の役にも立ちません。

基本的に、この時点で私は「しない」と言います。代わりに、通常のタイプを作成し、そのタイプとして公開します。匿名型は、それらを作成するメソッドの外ではうまく機能しません (データバインディングやシリアライゼーションなどの小さな注意点がありますが、問題ありません)。

于 2013-08-15T09:31:08.093 に答える
1

これはどう:

public List<dynamic> GetAnonymousList()
{
   var list = new List<dynamic>()
    {
       new { Foo = 123, Bar = "abc" },
       new { Foo = 456, Bar = "def" }
    };

    return list;
}

呼び出し元では、次のことができます。

int fooSum = GetAnonymousList().Sum(item => item.Foo);
IEnumerable<string> bars = GetAnonymousList().Select(item => (string)item.Bar);

これはおそらく実際には aList<object>を返し、Tomas Petricek によって説明されたトリックを使用して元の匿名型にキャストするのと同じくらい悪いことですが:

http://toasp.net/blog/cannot-return-anonymous-type-from-method.aspx

他の答えが言ったように:それを返す必要がある場合は、アイテムの適切なタイプ/インターフェースを定義することをお勧めします。

于 2013-08-15T10:00:50.003 に答える
1

ドキュメントから:

フィールド、プロパティ、イベント、またはメソッドの戻り値の型を匿名型として宣言することはできません。同様に、メソッド、プロパティ、コンストラクター、またはインデクサーの仮パラメーターを匿名型として宣言することはできません。匿名型、または匿名型を含むコレクションを引数としてメソッドに渡すには、パラメーターを型オブジェクトとして宣言します。ただし、これを行うと、厳密な型指定の目的が無効になります。クエリ結果を格納するか、メソッド境界の外に渡す必要がある場合は、匿名型ではなく、通常の名前付き構造体またはクラスを使用することを検討してください。

これは、コメントで言われたことを実質的に要約しています。メソッドから何かを返す必要がある場合、それはクラスのインターフェースの一部です。謎めいたオブジェクトを返すインターフェイスは、明確ではなく、クライアントにとって読みにくく、保守が困難です。

于 2013-08-15T09:30:37.370 に答える
0

あなたはこれに似た何かをすることができます

  public List<T> CreateList<T>(T itemOftype)
  {
     List<T> newList = new List<T>();
     return newList;
  } 

   var error = new { Header= "AVBC", Details = "Details" };
   var errorList = CreateList(error );

   errorList.Add(new { Header= "AVBC_BCGBD", Details = "Details_SBNJHJH" }

匿名オブジェクトの配列を作成してToList()メソッドを呼び出すこともできます

于 2013-08-15T09:28:17.770 に答える
0

これまでのすべての回答は、実際にやりたいことは、メソッドJSONによく似たものから戻ることであるということを見逃しているようですwep.api

Request.CreateErrorResponseしかし、メソッドのオーバーロードのリスト (こちらを参照)に基づくと、匿名型をコードから単純に返すことはできないようです。

代わりに、メソッドの既存のオーバーロードの 1 つを使用する必要があります。たぶん、実際にフォーマット済みの文字列として返すことができますか、またはオーバーロードを使用してみてくださいModelStateDictionary(それが機能するかどうか、またはどれほど難しいかはわかりません)?

しかし、 を受け取るオーバーロードがないためobject(および とは対照的にジェネリック オーバーロードがないためRequest.CreateResponse)、必要なことを正確に行うことはできません。

于 2013-08-15T10:04:23.393 に答える