하지만 Albedo 캔. 이것은 개념 증명 코드 일 뿐이지 만 일반적인 생각을 설명해야합니다.
는
ReflectionVisitor<T>
로부터 도출 새로운 클래스 생성 :
가
public class PropertyCopyVisitor<T> : ReflectionVisitor<T>
{
private readonly T source;
private readonly T destination;
public PropertyCopyVisitor(T source, T destination)
{
this.source = source;
this.destination = destination;
}
public override IReflectionVisitor<T> Visit(
PropertyInfoElement propertyInfoElement)
{
var pi = propertyInfoElement.PropertyInfo;
pi.SetValue(this.destination, pi.GetValue(this.source));
return this;
}
public override T Value
{
get { return this.destination; }
}
}
구현의 중요한 부분이 source
에서 destination
오브젝트마다 특성을 복사의 반사를 이용하는 Visit
과부하이다. 이제 테스트를 작성할 수
이 구현은 Value
속성이 사용되지 않습니다, destination
변이합니다,하지만 그것은 ReflectionVisitor<T>
에서 abstract
때문에 거기에있을 가지고 있기 때문에
... 같은 :
var fixture = new Fixture();
var a = fixture.Create<Foo>();
var b = fixture.Create<Foo>(); // Or just create a new, empty Foo...
// This copies all properties from a to b:
new TypeElement(typeof(Foo)).Accept(new PropertyCopyVisitor<Foo>(a, b));
Assert.False(ReferenceEquals(a, b));
Assert.Equal(a.Name, b.Name);
여기서도 fixture
을 사용하여 b
을 만들었지 만 모든 속성을 덮어 쓰게되므로이 작업을 수행 할 필요가 없습니다. Foo
에 매개 변수없는 생성자가있는 경우 new Foo()
을 대신 사용할 수 있습니다. 아무런 차이가 없다.
개념 증명은 명시 적으로 속성 만 복사합니다. 필드를 복사해야하는 경우 적절한 Visit
메소드도 무시해야합니다. 게다가 문제의 객체가 생성자 인수를 취하는 경우 명시 적으로 처리해야합니다.
new TypeElement(typeof(Foo)).Accept(new PropertyCopyVisitor<Foo>(a, b));
을 쓰는 것이 지루한 경우에는 주위에 도우미 메서드를 작성하는 방법을 찾아야합니다. 추가 참고로
,
PropertyCopyVisitor
하지
가 실제로 무엇을 위해 T
형식 인수를 사용하지 않기 때문에, 일반적으로을 가지고있다. 이 타입 생성자에게 타입 안전성이 좋다 ...