6

linqクエリ('items')を受け取り、それを介して列挙してプロパティを追加するgeneric<>関数があります。アイテム自体ではなく、元の「アイテム」のすべてのプロパティを選択するにはどうすればよいですか(以下のコードのように)?

したがって、SQLと同等です:アイテムからFooとして*、'bar'を選択します

foreach (var item in items)
{
    var newItem = new {
        item, // I'd like just the properties here, not the 'item' object!
        Foo = "bar"
    };

    newItems.Add(newItem);
}
4

5 に答える 5

5

C# のすべての型は厳密に型指定されているため、あなたが使用しているような匿名のものであっても、あなたが提案していることを行う簡単な方法はありません。しかし、それをやってのけることは不可能ではありません。これを行うには、リフレクションを利用して独自のアセンブリをメモリに出力し、必要な特定のプロパティを含む新しいモジュールと型を追加する必要があります。以下を使用して、匿名アイテムからプロパティのリストを取得できます。

foreach(PropertyInfo info in item.GetType().GetProperties())
    Console.WriteLine("{0} = {1}", info.Name, info.GetValue(item, null));
于 2008-09-21T01:55:54.667 に答える
3

私が投稿しようとしていたことを正確に書いてください。私はいくつかのコードを準備していました:/

少し複雑ですが、とにかく:

ClientCollection coll = new ClientCollection();
var results = coll.Select(c =>
{
    Dictionary<string, object> objlist = new Dictionary<string, object>();
    foreach (PropertyInfo pi in c.GetType().GetProperties())
    {
        objlist.Add(pi.Name, pi.GetValue(c, null));
    }
    return new { someproperty = 1, propertyValues = objlist };
});
于 2008-09-21T01:59:47.437 に答える
0

あなたにそれらを与えるためにアイテムを頼んでください。

リフレクションは1つの方法です...ただし、コンパイル時にすべてのプロパティがわかっているため、各アイテムには、このクエリが必要なものを取得するのに役立つメソッドを含めることができます。

メソッドシグネチャの例を次に示します。

public XElement ToXElement()
public IEnumerable ToPropertyEnumerable()
public Dictionary<string, object> ToNameValuePairs()
于 2008-09-21T03:04:01.010 に答える
0

Department クラスのコレクションがあるとします。

   public int DepartmentId { get; set; }
   public string DepartmentName { get; set; }

次に、次のような匿名型を使用します。

        List<DepartMent> depList = new List<DepartMent>();
        depList.Add(new DepartMent { DepartmentId = 1, DepartmentName = "Finance" });
        depList.Add(new DepartMent { DepartmentId = 2, DepartmentName = "HR" });
        depList.Add(new DepartMent { DepartmentId = 3, DepartmentName = "IT" });
        depList.Add(new DepartMent { DepartmentId = 4, DepartmentName = "Admin" });
        var result = from b in depList
                     select new {Id=b.DepartmentId,Damartment=b.DepartmentName,Foo="bar" };
于 2014-09-19T06:25:41.647 に答える
0
from item in items
where someConditionOnItem
select
{
     propertyOne,
     propertyTwo
};
于 2008-09-21T01:41:34.033 に答える