8

すべてを具体的にリストすることなく、オブジェクトのすべてのプロパティを投影してさらに追加することは可能ですか?たとえば、これを行う代わりに:

   var projection = from e in context.entities
                    select new QuestionnaireVersionExtended
                    {
                        Id = e.Id,
                        Version = e.Version,
                        CreationDate = e.CreationDate,
                         ... 
                         many more properties
                         ...
                        NumberOfItems = (e.Children.Count())
                    };

私たちはこのようなことをすることができますか?

   var projection = from e in context.entities
                    select new QuestionnaireVersionExtended
                    {
                        e,
                        NumberOfItems = (e.Children.Count())
                    };

同じ名前のeからすべてのプロパティを取得し、それに「NumberOfItems」プロパティを追加する場所はどこですか?

4

3 に答える 3

3

いいえ、これは不可能です。LINQ式のselect句を使用すると、値を生成する通常のC#式を使用できます。このようなテンプレートスタイルの方法でオブジェクト初期化子を介してオブジェクトを作成するC#構造はありません。プロパティを一覧表示するか、明示的なコンストラクターを使用する必要があります。

于 2010-06-24T19:58:53.817 に答える
1

エンティティとNumberOfItemsを取得するコンストラクターを追加すると、QuestionnaireVersionExtendedコンストラクターを直接使用できます。

var projection = from e in context.entities
     select new QuestionnaireVersionExtended(e, NumberOfItems = (e.Children.Count()));

ただし、コンパイラに「すべてのプロパティを明示的にコピーする」ように指示する方法はありません。

于 2010-06-24T20:01:57.667 に答える
1

これを達成する方法はいくつかありますが、それらはすべて悪夢になります。

1.)コンストラクターをオーバーロードし、そこにあるすべての値をコピーします(ただし、それを回避しようとしています。

2.)リフレクションを使用してプロパティをコピーします(多くの悪い副作用、推奨されません)

3.)デコレータパターンを使用します。元のクラスに値を追加したように見えるので、デコレータを使用するのに最適な時期だと思います。これにより、プロパティが追加されても見逃されないようになります。コンパイルが中断されますが、装飾されているオブジェクトがである場合、このソリューションは完全ではありませんsealed

于 2010-06-24T20:05:33.903 に答える