Я пишу метод в C # (2.0), который должен возвращать коллекцию простых объектов. Обычно я бы сделал что-то вроде этого:
class MyWidget
{
struct LittleThing
{
int foo;
DateTime bar;
}
public IList<LittleThing> LookupThings()
{
// etc.
}
}
Однако я должен объявить этот метод в интерфейсе. Звонящий не видит MyWidget
, только интерфейс IWidget
. Вышеуказанная настройка не работает в этой ситуации, потому что C # не позволяет определять типы внутри интерфейса. Как правильно или лучше всего сделать такое заявление?
Простая вещь, о которой я подумал, - это просто объявить LittleThing
вне интерфейса. Это не кажется хорошим, по нескольким причинам. Первый: он используется только этим единственным методом в этом единственном классе, поэтому не кажется, что LittleThing
должен быть независимым типом, просто плавающим сам по себе. Второе: если аналогичные методы будут написаны для других классов, они будут возвращать разные типы данных (по уважительным причинам), и я не хочу загромождать пространство имен тонной структур с одинаковыми именами, которые отличаются незначительно друг от друга.
Если бы мы могли обновить нашу версию .Net, я бы просто вернул Tuple<>
, но это еще не будет вариант в течение некоторого времени.
[Отредактировано, чтобы добавить: маленький объект должен содержать более двух полей, поэтому KeyValuePair<K,V>
не совсем обрежет его.]
[Отредактировано, чтобы добавить дальше: IWidget
реализован только одним классом, Widget
. Я думаю, что странно иметь интерфейс только для одного класса, но это было сделано, чтобы удовлетворить старую политику кодирования, которая требовала, чтобы контракт всегда был в отдельной сборке от реализации. Указанная политика исчезла, но у нас нет ресурсов, чтобы провести рефакторинг всего приложения и удалить все ненужные интерфейсы.]
Какая лучшая практика?