当 abstract class 没有公开每个构造函数参数时,为什么我不能创建相似代理?
Why can't I create a likeness proxy when abstract class not exposing every constructor argument?
我使用 Ploeh 的 SemanticComparison 库取得了巨大的成功 - 除非我有一个抽象 class 涉及,它没有公开其所有构造函数参数。
这是我得到的异常 -
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; set; }
添加到抽象class Bar
,那么一切都很好。我真的认为这是一个次优的解决方案,因为我不想公开 属性 age
。它只是被用来计算其他东西。
如何在不为了测试而公开属性的情况下解决此问题。是否有另一个库可以在没有这个问题的情况下达到同样的效果?
当获取目标 class 的属性并与源类型的构造函数匹配时出现问题时会引发此错误,尽管错误看起来好像只有 constructors 正在映射。
在您的情况下,内部异常是由于 class 中没有 public 属性。我很确定你的修复只是将映射重定向到你的虚拟 属性.
您可以在基础 class 上用 public int age { get { return _age; } }
修复它 - 在这个例子中没有什么坏处。
此类问题的常用逃生口是使用 InternalVisibleTo
,但库当前在映射类型时仅使用 BindingFlags.Public
,因此它不会看到为以下内容创建的内部 属性这个目的。
除了 BindingFlags.Public
之外,我还可以通过调整 the source 来使用 BindingFlags.NonPublic
来创建代理,但我不确定这是一个合理的方法。
我使用 Ploeh 的 SemanticComparison 库取得了巨大的成功 - 除非我有一个抽象 class 涉及,它没有公开其所有构造函数参数。
这是我得到的异常 -
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; set; }
添加到抽象class Bar
,那么一切都很好。我真的认为这是一个次优的解决方案,因为我不想公开 属性 age
。它只是被用来计算其他东西。
如何在不为了测试而公开属性的情况下解决此问题。是否有另一个库可以在没有这个问题的情况下达到同样的效果?
当获取目标 class 的属性并与源类型的构造函数匹配时出现问题时会引发此错误,尽管错误看起来好像只有 constructors 正在映射。
在您的情况下,内部异常是由于 class 中没有 public 属性。我很确定你的修复只是将映射重定向到你的虚拟 属性.
您可以在基础 class 上用 public int age { get { return _age; } }
修复它 - 在这个例子中没有什么坏处。
此类问题的常用逃生口是使用 InternalVisibleTo
,但库当前在映射类型时仅使用 BindingFlags.Public
,因此它不会看到为以下内容创建的内部 属性这个目的。
除了 BindingFlags.Public
之外,我还可以通过调整 the source 来使用 BindingFlags.NonPublic
来创建代理,但我不确定这是一个合理的方法。