2013-06-24 2 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()); 

यह कैसे प्राप्त करने के लिए?

मैं वास्तव में केवल परिणाम के लिए देखभाल, यहाँ दिखाया गया है काल्पनिक एपीआई के लिए नहीं है, तो अपने ही लागू करने ISpecimenBuilder या ICustomization एक समस्या नहीं है। ,

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

यह करने के लिए सबसे आसान तरीका है एक कस्टम नमूना बिल्डर के माध्यम से शायद है

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)); 
    } 
} 

यह अंततः आपको यह कहने की अनुमति देगा:

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

धन्यवाद, यह एक आकर्षण की तरह काम करता है! –

संबंधित मुद्दे

 संबंधित मुद्दे