10

こんにちは、メソッドの匿名型を宣言する方法を見つける必要があります。これは私のコードです:

public List<var> ListOfProducts(string subcategory)
{
    var products = (from p in dataContext.Products
                    join s in dataContext.SubCategories.Where(x => x.SubCatName == subcategory)
                        on p.SubcatId equals s.SubCatId
                    join b in dataContext.Brands on p.BrandId equals b.BrandId
                    select new
                    {
                        Subcategory = s.SubCatName,
                        Brand = b.BrandName,
                        p.ProductName,
                        p.ProductPrice
                    });
    return products;
} 

メソッドの List にどの型を設定すればよいかわかりません。この場合はどうすればよいですか?

4

4 に答える 4

21

Anonymous Typeメソッドから を返すことはできません。

あなたのタイプのクラスを作成し、それを返すだけです。

public class Product
{
    string Subcategory { get; set; }
    string Brand { get; set; }
    string ProductName { get; set; }
    decimal ProductPrice { get; set; }
}

次に、次のように返します。

var products = (from p in dataContext.Products
                    join s in dataContext.SubCategories.Where(x => x.SubCatName == subcategory) on p.SubcatId
                        equals s.SubCatId
                    join b in dataContext.Brands on p.BrandId equals b.BrandId
                    select new Product
                               {
                                   Subcategory = s.SubCatName,
                                   Brand = b.BrandName,
                                   p.ProductName,
                                   p.ProductPrice
                               });

    return products;

編集: @JamesMichaelHare が指摘するように、私の最初のステートメントを明確にするために、技術的にはobjectorを返すことでメソッドから匿名型を返すことができますが、または他の方法dynamicを使用する必要があるため、おそらく価値よりも面倒ですReflectionオブジェクトのプロパティにアクセスします。

于 2012-12-24T16:39:02.157 に答える
9

MSDN によると、動的型を使用すると、それが発生する操作でコンパイル時の型チェックをバイパスできます。代わりに、これらの操作は実行時に解決されます。

代わりにこれを試してください:

public IEnumerable<dynamic> ListOfProducts(string subcategory) 
于 2012-12-24T16:40:21.040 に答える
4

私が言うには、これには別のモデルを定義する必要があります。返された結果をプレゼンテーション層に使用する場合は ViewModel を定義する必要があり、ディストリビューション層に使用する場合は Dto オブジェクトとして定義できます。

public class ProductDto
{
    public string Subcategory {get; set; }
    public string Brand { get; set; }
    public string ProductName{ get; set; }
    public decimal ProductPrice{ get; set; }
}
于 2012-12-24T16:42:37.230 に答える
2

注意: 匿名型は、メソッド (または関数) の範囲外ではなく、その範囲内で使用するように設計されています。

しかし、いくつかの拡張メソッドといくつかの追加のキャストによってそれを行う方法があります (私はこれが好きではありません):

(コードでは、LINQ 式にも .ToList() を追加する必要があります。)

拡張方法は次のとおりです。

static List<T> InitList<T>(this T o) { return new List<T>(); }
static T CastToThis<T>(this  T target, object o) { return (T)o; }

次の方法で、匿名型のリストを初期化できます。

var list = new { Name = "Name", Age = 40 }.InitList();

次を使用して、メソッドの返されたオブジェクトをこのリストの型にキャストします。

list = list.CastToThis(returnedValueOfYourMethod);

もう 1 つ: 匿名型はアセンブリ内でのみ有効であり、アセンブリの境界を越えて渡すことはできません。ここから:

C# 仕様では、1 つのアセンブリの 2 つの場所で "同じ" 匿名型を使用すると、型が 1 つの型に統合されることが保証されています。「同じ」であるためには、2 つの匿名型がまったく同じメンバー名とまったく同じメンバー型を、まったく同じ順序で持つ必要があります。

全体として、新しい型を宣言する方がはるかに実用的であるため、なぜそれを行う必要があるのか​​ わかりません。これが本当に必要な場合は、C#で動的型を調べる必要があり、さらに魔法のことを行う場合は、採用する必要があります反射。

于 2012-12-24T18:42:25.797 に答える