У меня есть общий словарь объектов с ключом типа Тип
:
public class DynamicObject : IDictionary<Type, object>
Идея состоит в том, что этот объект используется совместно в Архитектура на основе плагинов, и поэтому тип (который может находиться в .dll плагина) используется в качестве ключа для предотвращения конфликтов между плагинами. Этот тип также используется для хранения метаданных о поле (таких как описание этого поля или фактический тип этого поля).
В настоящее время подключаемым модулям необходимо устанавливать значения полей в этом объекте с помощью кода, подобного этому:
DynamicObject someObject;
string someValue;
someObject[typeof(UsernameField)] = someValue;
Единственная проблема заключается в том, что это небезопасно по типу, даже если тип UsernameField
является зная точный тип ожидаемого значения (например, int
или в данном случае строка
), значение, предоставленное здесь, просто вводится как объект. Я хотел бы использовать дженерики, чтобы сделать установку / получение типа свойств безопасным, но я не уверен, как это сделать. Пока лучшее, что я придумал, это следующее:
// Field is a base class for all types used as keys on DynamicObject
[Description("Username of the user")]
public class UsernameField : Field
{
public static void Set(DynamicObject obj, string value)
{
obj[typeof(UsernameField)] = someValue;
}
}
// To set fields
UsernameField.Set(obj, someValue);
Это типобезопасный, однако это означает, что каждый из моих типов полей (например, UsernameField
) имеет почти идентичный static Set
метод.
Как я могу получить безопасный для типов доступ к значениям таким образом, не имея множества почти идентичных методов для каждого из моих типов полей?
В качестве альтернативы, используется Тип
в качестве ключа, например это хорошая идея, или есть скрытые подводные камни, о которых я еще не знаю?