Не пойму, чего nameof() ругается...
Как сделать, чтобы работало?
using System;
using System.Collections.Generic;
using System.Linq;
class A
{
private int X { get { return 1; } }
}
public class Program
{
public static void Main()
{
Console.WriteLine(nameof(A.X));//CS0122
}
}
Здравствуйте, StatujaLeha, Вы писали:
SL>Не пойму, чего nameof() ругается...
Видимость членов класса, упоминаемых в nameof, подчиняется тем же правилам, что и обычное обращение к членам класса. То есть private свойство будет доступно только внутри того класса, в котором оно объявлено.
SL>Как сделать, чтобы работало?
Использовать обычный строковый литерал, или сделать свойство public, или перенести nameof внутрь того класса, где объявлено свойство (например, поместить его в public метод, который может быть вызван снаружи).
Здравствуйте, StatujaLeha, Вы писали:
SL>Чего бы ему и не быть доступным? Я же не значение из поля беру, а его имя в виде строки.
А какая разница? Объявление члена класса private означает, он является не частью публичного контракта, а скрытой деталью реализации, и может менять своё поведение, смысл, название, а также может быть вообще удалён, и это никак не должно требовать менять что-то в коде клиентов этого класса. Использование nameof для private члена класса очевидно нарушает это соглашение.
Здравствуйте, nikov, Вы писали:
N>А какая разница? Объявление члена класса private означает, он является не частью публичного контракта, а скрытой деталью реализации, и может менять своё поведение, смысл, название, а также может быть вообще удалён, и это никак не должно требовать менять что-то в коде клиентов этого класса. Использование nameof для private члена класса очевидно нарушает это соглашение.
Все так, по этому вопросов нет.
Моя ситуация: есть именованная magic константа, нужно иметь к ней доступ из unit-теста.
Здравствуйте, StatujaLeha, Вы писали:
SL>Моя ситуация: есть именованная magic константа, нужно иметь к ней доступ из unit-теста.
Можно сделать свойство internal и дать сборке с unit-тестами доступ с помощью [assembly: InternalsVisibleTo("...")]. Но стоит подумать, действительно ли unit-тесты нужно делать зависимыми от деталей реализации. Может быть, magic константу нужно сделать частью публичного контракта.
Внутри класса есть деталь реализации в виде magic constant. Юзеру она не нужна: собственно класс как раз все эти детали реализации от него и скрывает.
Но мне она нужна для написания unit-теста.
План был такой:
protected static readonly PrivateType _MyType = new PrivateType(typeof(MyType));
public static int ValueInt => (int)_MyType .GetStaticFieldOrProperty("Value");
Здравствуйте, nikov, Вы писали:
N>Можно сделать свойство internal и дать сборке с unit-тестами доступ с помощью [assembly: InternalsVisibleTo("...")]. Но стоит подумать, действительно ли unit-тесты нужно делать зависимыми от деталей реализации. Может быть, magic константу нужно сделать частью публичного контракта.
Там идет работа с проверкой сериализации данных в некоторый формат.
Magic constant-а спрятана, юзеру она не нужна.
Думаю, вариант с InternalsVisibleTo сойдет.
Здравствуйте, StatujaLeha, Вы писали:
SL>Моя ситуация: есть именованная magic константа, нужно иметь к ней доступ из unit-теста.
Что-то здесь не правильно. Тест не должен полагаться на внутренние детали реализации.
Т.е имеем входные данные, зависимости (mocks) и ожидаемый результат. И все. Никаких private.
Здравствуйте, StatujaLeha, Вы писали:
SL>Здравствуйте, _NN_, Вы писали:
SL>Внутри класса есть деталь реализации в виде magic constant. Юзеру она не нужна: собственно класс как раз все эти детали реализации от него и скрывает. SL>Но мне она нужна для написания unit-теста.
Что тестируется то ?
Как вариант вынести эту константу в отдельный internal класс, который будет доступен тесту через InternalsVisibleTo как предлагали раньше.
Тестируем бинарную сериализацию. Формат сериализации определен не нами.
Есть байт с флагами. Когда оба флага убраны, то значение не нулевое — это и есть magic constant.
В тесте и нужно проверить, что когда оба флага убраны, то значение байта magic constant.
Здравствуйте, _NN_, Вы писали:
_NN>Что тестируется то ?
Тестируем бинарную сериализацию. Формат сериализации определен не нами.
Есть байт с флагами. Когда оба флага убраны, то значение не нулевое — это и есть magic constant.
В тесте и нужно проверить, что когда оба флага убраны, то значение байта magic constant.
_NN>Как вариант вынести эту константу в отдельный internal класс, который будет доступен тесту через InternalsVisibleTo как предлагали раньше.
Сделал константу internal static readonly + InternalsVisibleTo.