Спасибо всем, кто нашел время, чтобы ответить и обсудить мой вопрос.
Просто, чтобы вы знали, я реализовал решение, достаточное для моих нужд.Решение не является общим, и у него есть некоторые подводные камни, но я подумала, что поделюсь им в любом случае, если оно может помочь кому-то еще.
В принципе, это тот класс, который используется при определенииполя выглядят так:
public class Unit : IUnit {
public NameOfField { get; set; }
...
}
Как видите, класс реализует интерфейс IUnit, и я предоставил открытый установщик в свойстве NameOfField.
Статические поля обычно определяются какэто внутри некоторого содержащего класса:
public static Unit Hectare = new Unit();
Мое решение состоит в том, чтобы установить свойство NameOfField посредством отражения, прежде чем поле будет использовано в реализации.Я делаю это с помощью статического конструктора (который, конечно, должен быть вызван до доступа к полям модуля. Я использую Linq для обхода исполняемой сборки для соответствующих полей, и когда я обнаружил эти поля (поля, тип которых реализует интерфейс IUnit)), Я установил свойство NameOfField для каждого из них, используя метод расширения Any:
Assembly.GetExecutingAssembly().GetTypes().
SelectMany(type => type.GetFields(BindingFlags.Public | BindingFlags.Static)).
Where(fieldInfo => fieldInfo.FieldType.GetInterfaces().Contains(typeof(IUnit))).
Any(fieldInfo =>
{
((IUnit)fieldInfo.GetValue(null)).NameOfField= fieldInfo.Name;
return false;
});
У этого подхода есть некоторые недостатки:
- Необходимо вызвать статический конструкторпутем ручного вмешательства до того, как к каким-либо полям модуля можно будет получить доступ
- Установщик NameOfField является общедоступным. В моем случае это не проблема, но это может быть при применении в других сценариях. (Я предполагаю, что установщик может быть закрытыми призвал к дальнейшим размышлениям, но я не потратил время на дальнейшее изучение этого пути.)
- ...?
В любом случае, возможно, это решение может помочькто-то еще, чем я.