문제

linq 쿼리('항목')를 사용하고 이를 통해 추가 속성을 추가하는 일반<> 함수가 있습니다.항목 자체가 아닌 원래 '항목'의 모든 속성을 선택하려면 어떻게 해야 합니까(아래 코드처럼)?

따라서 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);
}
도움이 되었습니까?

해결책

C#의 모든 유형은 강력한 형식이므로 귀하가 사용하고 있는 익명 유형도 마찬가지이므로 귀하가 제안한 작업을 수행하는 쉬운 방법은 없습니다.하지만 떼어내는 것이 불가능한 것은 아닙니다.이를 위해서는 리플렉션을 활용하고 원하는 특정 속성이 포함된 새 모듈과 유형을 추가하여 메모리에 자체 어셈블리를 내보내야 합니다.다음을 사용하여 익명 항목의 속성 목록을 얻을 수 있습니다.

foreach(PropertyInfo info in item.GetType().GetProperties())
    Console.WriteLine("{0} = {1}", info.Name, info.GetValue(item, null));

다른 팁

제가 포스팅할 내용을 정확히 쓰셨네요.방금 코드를 준비하고 있었습니다 :/

조금 복잡하지만 어쨌든:

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 };
});
from item in items
where someConditionOnItem
select
{
     propertyOne,
     propertyTwo
};

그 물건을 당신에게 주도록 요청하십시오.

반성은 일방적이다...그러나 모든 속성은 컴파일 타임에 알려지기 때문에 각 항목에는 이 쿼리가 필요한 것을 얻는 데 도움이 되는 메서드가 있을 수 있습니다.

다음은 몇 가지 메소드 서명 예시입니다.

public XElement ToXElement()
public IEnumerable ToPropertyEnumerable()
public Dictionary<string, object> ToNameValuePairs()

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" };
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top