2010-01-04 4 views
1

Имейте класс, который является производным от System.Windows.Forms.UserControl и реализует интерфейс IFoo. После того, как экземпляр SomeControl, созданный с указанной высотой, и присвоенный локальной переменной IFoo , отображает, попытка присвоить значение отображение. Свойство Height с помощью публичного сеттера для меня не работает.Назначение C# не соответствует ожидаемому

Я наблюдаю это, выполняя отладчик, поэтому я сфокусировал этот тестовый пример на упрощение. Я понимаю "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

Итак, нет ли исключения при попытке установить свойство «Высота»? Для второго оператора Assert значение 123 равно или что-то еще? –

+0

Вопросы: Вы добавили какой-либо код для обработки свойства Height самостоятельно, переопределяя/заменив существующее свойство Height UserControl?Контролирует ли пользователь контроль над чем-то, чтобы его высота не изменилась вообще? –

+0

Это поможет, если вы разместите полную, но краткую, компилируемую и исполняемую/проверяемую программу, чтобы мы могли сами воспроизвести проблему. –

ответ

0

Является ли тип, реализующий IFoo структуру или класс? Если это структура, вы не можете изменить ее свойства после ее создания.

Если вы используете код SomeControl, который должен помочь диагностировать проблему дальше.

Кроме того, если вы можете запустить модульный тест в отладчике и проверить его значение, это также будет полезно.

Наконец, рекомендуемый способ написания таких тестов заключается в следующем:

Assert.AreEqual(123, display.Height); 

Это обеспечит гораздо лучше сообщения об ошибках, когда тестовый модуль из строя (что это такое).

+0

Или с помощью помощника синтаксиса 'Assert.That (display.Height, Is.EqualTo (123))'. Легче использовать правильные «ожидаемые» и «фактические» значения. –

0

Интерфейс в C# представляет собой просто контрактное описание требований для любых разработчиков. Ключом к этой фразе является «реализация».

EDIT: просто увидел, что ваш класс наследуется от UserControl, который уже имеет свойство Height. Чтобы получить доступ к свойству Height вашего интерфейса, вы должны явно ссылаться на это свойство из своего теста.

+0

Просто FYI, Auto-Implemented Properties ('blah {get; set;}') - это .Net 3.0+. Вы можете * заставить их работать в 2.0 с помощью последнего компилятора. (Visual Studio 2008 делает это, но Visual Studio 2005 не может) – Joshua

+0

Отредактировано, спасибо Джошуа. – jro

1

Это потому, что UserControl уже имеет определенное свойство высоты. Чтобы получить доступ к своей реализации, вам нужно будет ее бросить.

((IFoo)display).Height = 789; 

Это должно сработать. Кроме того, я предполагаю, что ваше свойство высоты явно определено?

public int IFoo.Height { get; set; } 
+0

Дисплей уже имеет тип 'IFoo' –

0

Я думаю, что ваша проблема в том, что UserControl уже имеет свойство с именем Height и что IFoo также определяет Height. Я не думаю, что вы предоставили достаточно информации, чтобы ответить на вопрос, но я бы предположил, что в зависимости от вашей реализации IFoo ваше свойство Height либо скрывает версию Height для UserControl, либо скрывается от нее. Я считаю, что это последнее, потому что мое воспоминание о том, что Height - это свойство только для чтения в UserControl.

+0

Заявления интерфейса не скрывают реализации, потому что они не являются реализациями, просто определениями –

+0

Интерфейс сам по себе не будет, но реализация может быть выполнена. Все зависит от того, как был написан класс. Например, была ли явная реализация метода интерфейса или неявного? – Nick

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