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가 등가이기 때문에 우리 개발에 큰 유연성을 가져왔다. 그러나 이렇게 하는 성능 비용은 아직 깊이 연구하지 않았다. 만약에 어떤 친구가 테스트한 적이 있다면 알려주세요. 감사합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
동적 형식의 매개변수화된 유효성 검사기We are building the documentation of @myndpm/dyn-forms at and we've added support for a variety of custom functions like...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.