有一个派生自System.Windows.Forms.UserControl的类,并实现一个接口IFoo。在使用指定的高度创建SomeControl实例并将其分配给本地IFoo变量 display 之后,尝试通过它公开为显示的高度属性赋值塞特不适合我。
我正在通过调试器观察这一点,所以我试图简化这个测试用例以简化操作。我意识到"select isn't broken"所以我的知识存在差距,为什么我不能设置这个属性所以我想了解它是什么。感谢。
public interface IFoo
{
int Height {get;set;} // which is implemented by UserControl
}
public class SomeControl : UserControl, IFoo { /*impl goes here*/ }
[TestFixture]
public class TestFixture
{
[Test]
public void Test()
{
IFoo display = ...
// assume that display is of type SomeControl
// and already has a value for Height at 123
Assert.IsTrue(display.Height == 123);
display.Height = 789;
Assert.IsTrue(display.Height == 789); //FAILS
}
}
答案 0 :(得分:1)
这是因为UserControl已经定义了height属性。要访问您的实现,您需要进行强制转换。
((IFoo)display).Height = 789;
那应该有用。另外,我假设您的高度属性是明确定义的吗?
public int IFoo.Height { get; set; }
答案 1 :(得分:1)
以下代码运行正常,因此问题必须出在您的假设或您遗漏的代码中。
请您发一个简短但完整的程序,我们可以自行编译和测试吗?
using NUnit.Framework;
using System.Windows.Forms;
public interface IFoo
{
int Height { get; set; } // which is implemented by UserControl
}
public class SomeControl : UserControl, IFoo
{
public SomeControl()
{
Height = 123;
}
}
[TestFixture]
public class TestFixture
{
[Test]
public void Test()
{
IFoo display = new SomeControl();
Assert.IsTrue(display.Height == 123);
display.Height = 789;
Assert.IsTrue(display.Height == 789);
}
}
答案 2 :(得分:0)
实现IFoo的类型是结构还是类?如果它是一个结构,那么在创建它之后就无法更改它的属性。
如果您共享SomeControl的代码,可以帮助进一步诊断问题。
此外,如果您可以在调试器中运行单元测试并检查该值,那么这也会有所帮助。
最后,编写此类测试的推荐方法如下:
Assert.AreEqual(123, display.Height);
当单元测试失败时(这是),这将提供更好的错误报告。
答案 3 :(得分:0)
C#中的接口仅仅是对任何实现者的要求的合同描述。该短语的关键是“实施”。
编辑:刚看到你的类继承自UserControl,它已经拥有了Height属性。要访问界面的Height属性,必须从测试中明确引用该属性。答案 4 :(得分:0)
我认为您的问题是UserControl已经有一个名为Height的属性,而且IFoo也定义了Height。我认为你没有提供足够的信息来回答这个问题,但我认为,根据你对IFoo的实现,你的Height属性要么隐藏了UserControl版本的Height,要么被它隐藏。我相信它是后者,因为我的回忆是Height是UserControl上的只读属性。