gpt4 book ai didi

c# - 如何创建省略所有类型的自动属性的自定义?

转载 作者:太空狗 更新时间:2023-10-29 19:44:09 27 4
gpt4 key购买 nike

我正在尝试创建自定义,允许我指定不应填充不在特定命名空间中的类型的属性。

基本上,我正在尝试改变这一点:

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,因此实现我自己的 ISpecimenBuilderICustomization 不是问题。

最佳答案

最简单的方法可能是通过自定义样本生成器:

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

像往常一样,提供匹配的自定义也是一个很好的约定:

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

关于c# - 如何创建省略所有类型的自动属性的自定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280912/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com