gpt4 book ai didi

c# - 当抽象类不公开每个构造函数参数时,为什么我不能创建相似代理?

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:28 25 4
gpt4 key购买 nike

我使用 Ploeh 的 SemanticComparison 库取得了巨大的成功——除非我涉及一个抽象类,它没有公开其所有构造函数参数。

这是我得到的异常 -

Ploeh.SemanticComparison.ProxyCreationException : The proxy of Foo could not be created using the same semantic heuristics as the default semantic comparison. In order to create proxies of types with non-parameterless constructor the values from the source constructor must be compatible to the parameters of the destination constructor.
----> System.InvalidOperationException : Operation is not valid due to the current state of the object.

这是我能想出的最简单的例子 -

// this fails with the aforementioned exception
_fixture.Create<Foo>().AsSource().OfLikeness<Foo>().CreateProxy();

public class Foo : Bar
{
public Foo(int age)
: base(age)
{
}
}

public abstract class Bar
{
private readonly int _age;

protected Bar(int age)
{
_age = age;
}
}

但是,如果我添加 public int NotAge { get;放; } 到抽象类 Bar,然后一切都很好。我真的认为这是一个次优的解决方案,因为我不想公开属性 age。它只是被用来计算其他东西。

如何在不为了测试而公开属性的情况下解决这个问题。是否有另一个库可以在没有这个问题的情况下实现相同的效果?

最佳答案

当获取目标类的属性并与源类型的构造函数匹配时出现问题时会引发此错误,尽管错误看起来好像只有构造函数被映射。

在您的情况下,内部异常是由于两个类中都没有公共(public)属性。我很确定您的修复只是将映射重定向到您的虚拟属性。

你可以用 public int age { get { return _age; 修复它} 在基类上——在这个例子中几乎没有什么坏处。

解决此类问题的常用方法是使用 InternalVisibleTo,但库目前在映射类型时仅使用 BindingFlags.Public,因此它不会看到内部属性为此目的而创建。

我能够通过调整 the source 来创建一个代理除了 BindingFlags.Public 之外还可以使用 BindingFlags.NonPublic,但我不确定这是一种合理的方法。

关于c# - 当抽象类不公开每个构造函数参数时,为什么我不能创建相似代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30262359/

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