У меня есть класс Serializable, который содержит данные, хранящиеся в полях.
Этот класс создается, сериализуется и отправляется клиентской программе.
Внимание! Класс находится в 3-й сборке вместе с другими сериализуемыми таблицами.
Пример класса (3-я сборка):
[Serializable]
public sealed class Settings
{
public int A;
public bool B;
…
public object N;
}
Пример инициализатора объекта (сервер):
var s = new Settings
{
A = 0;
B = true;
…
N = new Object();
};
Клиентская программа десериализует и использует объект.
Проблема в том, что я не хочу, чтобы клиентская программа изменяла значения полей.
Это не из соображений безопасности (они могли бы даже использовать Reflection ...), но чтобы уменьшить вероятность неудачи.
Но настоящая проблема в том, что есть СЛИШКОМ МНОГИЕ поля, я не хочу создавать 30+ конструкторов параметров, чтобы я мог использовать поля только для чтения. Кроме того, Object Initializer не будет работать.
Первой мыслью было использование открытых свойств с ограниченными сеттерами, чтобы я все еще мог (возможно) использовать объект Initializer.
Но, поскольку класс находится на третьей сборке, я не могу использовать внутренние сеттеры.
Защищенный бесполезен для этого, потому что мне пришлось бы в основном переписать базовый класс (даже сделав его сейчас запечатанным).
Теперь я думаю иметь конструктор, который принимает IDictionary<string, dynamic>
или IDictionary<string, object>
и инициализирует поля только для чтения, но это может привести к ошибкам, если какое-либо поле будет добавлено или удалено в будущем.
У меня закончились идеи, и мне кажется, что мне придется сделать что-то столь же безобразное, как:
public Settings
(
int a,
bool b,
…,
object n
)
{
A = a;
B = b;
…
N = n;
}
Полагаю, я мог бы использовать Reflection для установки полей только для чтения ...
Есть ли еще какой-нибудь элегантный способ сделать это?
Спасибо!