2017-11-07 12 views
1

자동 수정에는 동일한 데이터로 주어진 유형의 인스턴스를 여러 개 만들 수있는 기능이 있습니까? 내 클래스는 직렬화 할 수 없으며 이에 상응하는 참조가 아닌 두 개의 모델이 필요하지만 대신 일치하는 특성이 있습니다. 나는 AutoFixture이 할 수 있다고 생각하지 않는다모든 속성이 같은 복합 유형 생성하기

public class Foo 
{ 
    // Many more properties and similar models needing the same semantics. 
    public string Name { get; set; } 
} 

var a = fixture.Create<Foo>(); 
var b = fixture.Create<Foo>(); 

Assert.False(ReferenceEquals(a, b)); 
Assert.Equal(a.Name, b.Name); 

답변

0

하지만 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 형식 인수를 사용하지 않기 때문에, 일반적으로을 가지고있다. 이 타입 생성자에게 타입 안전성이 좋다 ...