dynamic를 이용하여 익명 대상이 값을 부여할 수 없는 문제를 해결합니다

3980 단어 dynamic

익명 객체 정보


익명 대상은.Net Framework 3.0은 다음과 같은 새로운 유형을 제공합니다.
var obj = { Name = "aa", Value = 1 };

Linq와 함께 익명 클래스로 코드에서 데이터를 조합할 수 있습니다. 예를 들어 다음과 같습니다.
var r = from p in DbContext.Actions 
    select new
      A = p.Name, 
      B = p.Text 
    };

특수 요구: 익명 대상 속성에 값 부여


그러나 다음과 같은 코드와 같이 가져온 익명 객체의 특정 속성에 값을 지정해야 하는 특수한 요구 사항이 있을 수 있습니다.
//      LINQ      
foreach(var item in r)
{
item.A = "new name";
}

이상의 코드가 실행될 때 '이 대상의 속성은 읽기만 하는 것' 이라는 이상한 메시지가 나타납니다.익명 클래스는 내부 구현에 있어 초기화할 때만 값을 부여할 수 있기 때문에 다시 바꾸려면 옳지 않다. 이러면 안 된다.

솔루션


그러나 가끔은 이런 수요가 있다. 그렇다면 어떤 방법으로 해결할 수 있을까?연구를 통해 다음과 같은 방안으로 해결할 수 있음을 발견했고 본인은 이미 검증을 통과했습니다.
정답은 바로 C# 4.0에 새로 제공된 동적 유형:dynamic에서 직접 코드를 입력하면 바로 알 수 있습니다.
//  dynamic    
List<dynamic> newpayList = new List<dynamic>();
payList.ForEach(t => {
//new ExpandoObject
dynamic d = new System.Dynamic.ExpandoObject();
d.IntervalDay = 0;
d.Percent = Math.Round(t.Amount / totalRevenue, 4);
d.Amount = adjAmount * Math.Round(t.Amount / totalRevenue, 4);
d.PayDate = t.EstPaymentDate;
d.IsLast = false;
newpayList.Add(d);
});

var count = newpayList.Count();
for (int i = 0; i < count; i++)
{
var item = newpayList[i];
if (i != 0) {
//
item.IntervalDay = (item.PayDate - newpayList[i - 1].PayDate).Days;
}
if( i == count - 1)
item.IsLast = true;
}

익명 대상을 동적 유형으로 대체하지만 실제로는 밀접한 관계를 가진다. 어떤 때는 익명 대상과dynamic가 등가이기 때문에 우리 개발에 큰 유연성을 가져왔다. 그러나 이렇게 하는 성능 비용은 아직 깊이 연구하지 않았다. 만약에 어떤 친구가 테스트한 적이 있다면 알려주세요. 감사합니다.

좋은 웹페이지 즐겨찾기