Ilist 객체 확장, 딥 카피 확장 방법
4166 단어 list
Ilist 객체 확장, 딥 카피 확장 방법
장면 적용
하나의 집합을 깊이 있게 복사하여 복제하는 방법이 적지 않다. 예를 들어 이미 하나의List
List<T> newList = new List<T>();
foreach(var item in someList)
{
T t = new T();
// ,
t.P1 = item.P1;
t.P2 = item.P2;
...
newList.Add(t);
}
만약 유사한 수요가 한 가지가 아니라면, 우리는 유사한 코드를 반복해서 써야 한다. 이것은 분명히 코드의 재사용 원칙에 부합되지 않는다.
사고의 방향
가장 먼저 떠오르는 것은 확장 방법이고 범용을 바탕으로 하는 확장 방법이다. 이것은 간단하고 코드를 올린다.
public static IList<T> Clone<T>(this IList<T> source)
{
IList<T> newList = new List<T>(source.Count);
foreach (var item in source)
{
newList.Add(..);
}
return newList;
}
이dd방법에는 new의 T대상이 있고 하나하나 속성에 값을 부여해야 하기 때문에 그것도 번거롭지 않다. 이때 분명히 어떤 학생이 반사를 생각했을 것이다. 그래, 반사를 사용하면 이 문제를 해결할 수 있지만 나는 아직 이상적이지 않다고 생각한다.
두 번째 생각...참, 마이크로소프트는 이미 우리에게 ICloneable라는 인터페이스를 제공하지 않았습니까?우리는 T에 제약을 가해야 하며 코드를 다음과 같이 수정해야 한다.
public static IList<T> Clone<T>(this IList<T> source)
where T : ICloneable
{
IList<T> newList = new List<T>(source.Count);
foreach (var item in source)
{
newList.Add((T)((ICloneable)item.Clone()));
}
return newList;
}
지금은 괜찮아 보인다. 기본적인 사고방식은 이미 형태가 갖추어져서 호출할 때 이렇게 사용할 수 있다. new List = some List.Clone();
물론 T에 ICloneable 인터페이스를 추가하고 Clone 방법을 실현하는 것을 잊지 마세요. Clone을 실현하는 방법은 매우 많습니다. 개인적인 조언은 다음과 같습니다.
public object Clone()
{
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, this);
stream.Position = 0;
var obj = formatter.Deserialize(stream) as Class;
return obj;
}
서열화된 방식으로 대상을 복제합니다. 이렇게 하는 전제는 Class가 Serializable로 표시되어야 한다는 것입니다.
EF 사용 시 발생한 실제 사례
예를 들어 하나의 Entity는 많은 관련 실체(주부표)가 있는데 현재 원시 기록을 새로운 기록으로 복제해야 한다. 모든 하부표를 포함한다. 만약에 일반적인 방법을 사용한다면 매우 번거롭다. 하부표를 하나하나 훑어보고 새로운 실체 대상을 new하고 하나씩 AddObject를 실행해야 한다. 만약에 위의 방안을 사용한다면 코드는 다음과 같다.
//
var resList = this.ResourcePlanService.GetList(t => t.QuoteID == quoteId).ToList();
ForeachCopy(resList, this.ResourcePlanService);
private void ForeachCopy<TModel, TService>(IList<TModel> list, TService service)
where TService : IService<TModel>
where TModel : ICloneable
{
list.Clone().ForEach( t => service.Add(t) );
}
이렇게 하면 코드가 많이 간소화되고 원래의 변동도 상대적으로 작다. TModel의 기본 클래스인 Entity ObjectBase를 ICloneable 인터페이스로 실현하고 Clone 방법을 실현하면 된다. 주의해야 할 것은 EF가 DB First 방식을 사용한다면 Clone 방법에서 Entity Key를null로 설정해야 한다. 그렇지 않으면 AddObject를 호출할 때 Object Management에서 이상을 던질 수 있다.
총결산
장점: 코드가 간단하고 복용도가 높은 단점: 클래스 대상을 수정하여 ICloneable 인터페이스를 계승해야 한다. 기본 클래스가 없으면 매우 번거로운 문제이며 클래스 대상은 Serializable로 표시해야 한다.
주소: http://www.cnblogs.com/qiuliang/archive/2012/02/29/2373671.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[SwiftUI]List화한 CoreData를 가로 스와이프로 행 삭제하는 방법상당히 조사했지만 일본어 자료가 없었기 때문에 비망록으로 남겨 둔다. 아래와 같이 CoreData를 참조한 리스트를 가로 스와이프로 삭제하고 싶었다. UI 요소뿐만 아니라 원본 데이터 당 삭제합니다. 잘 다른 페이지...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.