{"id":9616,"date":"2025-07-02T12:43:35","date_gmt":"2025-07-02T11:43:35","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=9616"},"modified":"2025-07-02T12:43:37","modified_gmt":"2025-07-02T11:43:37","slug":"c-swappable-identifiers","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-swappable-identifiers\/","title":{"rendered":"C# Swappable identifiers"},"content":{"rendered":"\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">public class Identifier : IComparable\n{\n    private object Value;\n\n    public Identifier(object value)\n    {\n        Value = value;\n    }\n\n    public override bool Equals(object obj)\n    {\n        if (obj == null || GetType() != obj.GetType())\n            return false;\n\n        var other = (Identifier)obj;\n        return EqualityComparer&lt;object>.Default.Equals(Value, other.Value);\n    }\n    public object GetValue() => Value;\n    public static bool operator ==(Identifier id1, Identifier id2)\n    {\n        if (ReferenceEquals(id1, id2))\n            return true;\n\n        if (id1 is null || id2 is null)\n            return false;\n\n        return id1.Equals(id2);\n    }\n    public static bool operator !=(Identifier id1, Identifier id2) => !(id1 == id2);\n\n    public override int GetHashCode() => Value.GetHashCode();\n    public int CompareTo(object other) => InternalCompareTo(other);\n    private int InternalCompareTo(object o) => CompareTo(o);\n\n    public static Identifier From(string o) => string.IsNullOrWhiteSpace(o) ? null : new SpecificIdentifier&lt;string>(o);\n    public static Identifier From(Guid? o) => (o == null || o == Guid.Empty) ? null : new SpecificIdentifier&lt;Guid>(o.Value);\n    public static Identifier From(int? o) => (o == null) ? null : new SpecificIdentifier&lt;int>(o.Value);\n    class SpecificIdentifier&lt;T> : Identifier\n    {\n        public T TypedValue { get; private set; }\n\n        public SpecificIdentifier(T value) : base(value)\n        {\n            TypedValue = value;\n        }\n    }\n}\n\npublic class IdentifierConverter : JsonConverter&lt;Identifier>\n{\n    public override void WriteJson(JsonWriter writer, Identifier value, JsonSerializer serializer)\n    {\n        serializer.Serialize(writer, value.GetValue());\n    }\n\n    public override Identifier ReadJson(JsonReader reader, Type objectType, Identifier existingValue, bool hasExistingValue, JsonSerializer serializer)\n    {\n        var token = JToken.Load(reader);\n        if (token is JValue valueWrapper)\n        {\n            var valueType = valueWrapper.Type;\n\n            return valueType switch\n            {\n                JTokenType.Integer => Identifier.From((int)valueWrapper.Value),\n                JTokenType.Guid => Identifier.From((Guid)valueWrapper.Value),\n                JTokenType.String => Identifier.From((string)valueWrapper.Value),\n                _ => null\n            };\n        }\n        return null;\n    }\n}<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9616","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/9616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=9616"}],"version-history":[{"count":1,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/9616\/revisions"}],"predecessor-version":[{"id":9617,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/9616\/revisions\/9617"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=9616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=9616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=9616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}