Инициализируйте много полей только для чтения без конструктора - PullRequest
0 голосов
/ 24 января 2019

У меня есть класс 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 для установки полей только для чтения ...

Есть ли еще какой-нибудь элегантный способ сделать это? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...