2013-06-24 4 views
8

特定の名前空間にない型のプロパティに値を設定しないように指定できるカスタマイズを作成しようとしています。これに全種類のタイプの自動プロパティを省略したカスタマイズを作成するにはどうすればよいですか?

fixture.Customize<Window>(c => c.OmitAutoProperties()); 
fixture.Customize<ContentControl>(c => c.OmitAutoProperties()); 
fixture.Customize<TextBlock>(c => c.OmitAutoProperties()); 
// Many many more... 

基本的に、私はこれを変更しようとしています

fixture.Customize(t => !t.Namespace.StartsWith("MyProject"), 
        c => c.OmitAutoProperties()); 

はどのようにこれを達成するために?

私は実際に結果を気にします。ここに示した架空のAPIではなく、自分でISpecimenBuilderまたはICustomizationを実装することは問題ではありません。

public class OmitAutoPropertiesForTypesInNamespace : ICustomization 
{ 
    private readonly string ns; 

    public OmitAutoPropertiesForTypesInNamespace(string ns) 
    { 
     this.ns = ns; 
    } 

    public void Customize(IFixture fixture) 
    { 
     fixture.Customizations.Add(new OmitPropertyForTypeInNamespace(this.ns)); 
    } 
} 

:それもマッチするカスタマイズを提供するために、良い慣習だ、いつものように

public class OmitPropertyForTypeInNamespace : ISpecimenBuilder 
{ 
    private readonly string ns; 

    public OmitPropertyForTypeInNamespace(string ns) 
    { 
     this.ns = ns; 
    } 

    public object Create(object request, ISpecimenContext context) 
    { 
     if (IsProperty(request) && 
      IsDeclaringTypeInNamespace((PropertyInfo)request)) 
     { 
      return new OmitSpecimen(); 
     } 

     return new NoSpecimen(request); 
    } 

    private bool IsProperty(object request) 
    { 
     return request is PropertyInfo; 
    } 

    private bool IsDeclaringTypeInNamespace(PropertyInfo property) 
    { 
     var declaringType = property.DeclaringType; 
     return declaringType.Namespace.Equals(
      this.ns, 
      StringComparison.OrdinalIgnoreCase); 
    } 
} 

答えて

3

これを行う最も簡単な方法は、カスタム標本ビルダーを通じて、おそらくですこれにより、最終的にあなたは言うことができます:

var fixture = new Fixture(); 
fixture.Customize(new OmitAutoPropertiesForTypesInNamespace("MyProject")); 
+0

ありがとう、それは魅力のように動作します! –

関連する問題