Убедитесь, что объект с определенным ключом создается статически один раз.C#

Место общения программистов C#
Ответить
Anonymous
 Убедитесь, что объект с определенным ключом создается статически один раз.

Сообщение Anonymous »

Я хотел бы реализовать на C# следующее:
  • Класс со свойством Key, который будет использоваться для уникальной идентификации объект
  • Набор предопределенных статических объектов

Код: Выделить всё

using System.Text.Json;

public sealed class Test
{
private static readonly HashSet _existingKeys = [];

public static readonly Test One = new("one");
public static readonly Test Two = new("two");

public Test(string key)
{
if (!_existingKeys.Add(key))
{
throw new ArgumentException($"Key '{key}' is already in use.");
}

Key = key;
}

public string Key { get; }
}

// Example usage
class Program
{
static void Main()
{
try
{
var three = new Test("one");
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message); // Output: Key 'one' is already in use.
}

var one = JsonSerializer.Serialize(Test.One);

try
{
var deserialized = JsonSerializer.Deserialize(one);
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message); // Output: Key 'one' is already in use.
}
}
}
Проблема, с которой я столкнулся, — это десериализация, поскольку она пытается создать экземпляр объекта, который, возможно, уже существует в памяти. Есть ли обходной путь? Я бы не хотел вручную поддерживать карту ключей, поскольку некоторые классы будут иметь множество предопределенных объектов, и объект легко пропустить. Кроме того, существуют случаи использования, когда объекты необходимо определять вне класса определения в другой сборке.
Обратите внимание, что меня интересует только уникальность объектов, определяемых пользователем.

Код: Выделить всё

public static readonly Test One = new("one");
Такие вещи, как десериализация/отражение, выходят за рамки.

Подробнее здесь: https://stackoverflow.com/questions/790 ... eated-once
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»