mirror of
https://github.com/ICDSystems/ICD.Common.Utils.git
synced 2026-02-16 13:15:07 +00:00
refactor: Moving JSON type name util into TypeExtensions
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
|
||||||
using ICD.Common.Properties;
|
using ICD.Common.Properties;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
@@ -8,16 +7,6 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
{
|
{
|
||||||
public static class JsonWriterExtensions
|
public static class JsonWriterExtensions
|
||||||
{
|
{
|
||||||
private static readonly Dictionary<Type, string> s_TypeToName;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Static constructor.
|
|
||||||
/// </summary>
|
|
||||||
static JsonWriterExtensions()
|
|
||||||
{
|
|
||||||
s_TypeToName = new Dictionary<Type, string>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Writes the type value.
|
/// Writes the type value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -35,7 +24,7 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string name = GetTypeName(type);
|
string name = type.GetNameWithoutAssemblyDetails();
|
||||||
extends.WriteValue(name);
|
extends.WriteValue(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,76 +79,5 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
}
|
}
|
||||||
writer.WriteEndArray();
|
writer.WriteEndArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the string representation foe the given type.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="type"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private static string GetTypeName(Type type)
|
|
||||||
{
|
|
||||||
if (type == null)
|
|
||||||
throw new ArgumentNullException("type");
|
|
||||||
|
|
||||||
string name;
|
|
||||||
if (!s_TypeToName.TryGetValue(type, out name))
|
|
||||||
{
|
|
||||||
name = RemoveAssemblyDetails(type.AssemblyQualifiedName);
|
|
||||||
s_TypeToName.Add(type, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Taken from Newtonsoft.Json.Utilities.ReflectionUtils
|
|
||||||
/// Removes the assembly details from a type assembly qualified name.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="fullyQualifiedTypeName"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private static string RemoveAssemblyDetails(string fullyQualifiedTypeName)
|
|
||||||
{
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
|
|
||||||
// loop through the type name and filter out qualified assembly details from nested type names
|
|
||||||
bool writingAssemblyName = false;
|
|
||||||
bool skippingAssemblyDetails = false;
|
|
||||||
for (int i = 0; i < fullyQualifiedTypeName.Length; i++)
|
|
||||||
{
|
|
||||||
char current = fullyQualifiedTypeName[i];
|
|
||||||
switch (current)
|
|
||||||
{
|
|
||||||
case '[':
|
|
||||||
writingAssemblyName = false;
|
|
||||||
skippingAssemblyDetails = false;
|
|
||||||
builder.Append(current);
|
|
||||||
break;
|
|
||||||
case ']':
|
|
||||||
writingAssemblyName = false;
|
|
||||||
skippingAssemblyDetails = false;
|
|
||||||
builder.Append(current);
|
|
||||||
break;
|
|
||||||
case ',':
|
|
||||||
if (!writingAssemblyName)
|
|
||||||
{
|
|
||||||
writingAssemblyName = true;
|
|
||||||
builder.Append(current);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
skippingAssemblyDetails = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (!skippingAssemblyDetails)
|
|
||||||
{
|
|
||||||
builder.Append(current);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder.ToString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
private static readonly Dictionary<Type, Type[]> s_TypeBaseTypes;
|
private static readonly Dictionary<Type, Type[]> s_TypeBaseTypes;
|
||||||
private static readonly Dictionary<Type, Type[]> s_TypeImmediateInterfaces;
|
private static readonly Dictionary<Type, Type[]> s_TypeImmediateInterfaces;
|
||||||
private static readonly Dictionary<Type, Type[]> s_TypeMinimalInterfaces;
|
private static readonly Dictionary<Type, Type[]> s_TypeMinimalInterfaces;
|
||||||
|
private static readonly Dictionary<Type, string> s_TypeToNameWithoutAssemblyDetails;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Static constructor.
|
/// Static constructor.
|
||||||
@@ -72,6 +73,7 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
s_TypeBaseTypes = new Dictionary<Type, Type[]>();
|
s_TypeBaseTypes = new Dictionary<Type, Type[]>();
|
||||||
s_TypeImmediateInterfaces = new Dictionary<Type, Type[]>();
|
s_TypeImmediateInterfaces = new Dictionary<Type, Type[]>();
|
||||||
s_TypeMinimalInterfaces = new Dictionary<Type, Type[]>();
|
s_TypeMinimalInterfaces = new Dictionary<Type, Type[]>();
|
||||||
|
s_TypeToNameWithoutAssemblyDetails = new Dictionary<Type, string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -307,6 +309,77 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
return index == -1 ? name : name.Substring(0, index);
|
return index == -1 ? name : name.Substring(0, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the string representation for the type.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="extends"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetNameWithoutAssemblyDetails(this Type extends)
|
||||||
|
{
|
||||||
|
if (extends == null)
|
||||||
|
throw new ArgumentNullException("extends");
|
||||||
|
|
||||||
|
string name;
|
||||||
|
if (!s_TypeToNameWithoutAssemblyDetails.TryGetValue(extends, out name))
|
||||||
|
{
|
||||||
|
name = RemoveAssemblyDetails(extends.AssemblyQualifiedName);
|
||||||
|
s_TypeToNameWithoutAssemblyDetails.Add(extends, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Taken from Newtonsoft.Json.Utilities.ReflectionUtils
|
||||||
|
/// Removes the assembly details from a type assembly qualified name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fullyQualifiedTypeName"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string RemoveAssemblyDetails(string fullyQualifiedTypeName)
|
||||||
|
{
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
|
||||||
|
// loop through the type name and filter out qualified assembly details from nested type names
|
||||||
|
bool writingAssemblyName = false;
|
||||||
|
bool skippingAssemblyDetails = false;
|
||||||
|
for (int i = 0; i < fullyQualifiedTypeName.Length; i++)
|
||||||
|
{
|
||||||
|
char current = fullyQualifiedTypeName[i];
|
||||||
|
switch (current)
|
||||||
|
{
|
||||||
|
case '[':
|
||||||
|
writingAssemblyName = false;
|
||||||
|
skippingAssemblyDetails = false;
|
||||||
|
builder.Append(current);
|
||||||
|
break;
|
||||||
|
case ']':
|
||||||
|
writingAssemblyName = false;
|
||||||
|
skippingAssemblyDetails = false;
|
||||||
|
builder.Append(current);
|
||||||
|
break;
|
||||||
|
case ',':
|
||||||
|
if (!writingAssemblyName)
|
||||||
|
{
|
||||||
|
writingAssemblyName = true;
|
||||||
|
builder.Append(current);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
skippingAssemblyDetails = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!skippingAssemblyDetails)
|
||||||
|
{
|
||||||
|
builder.Append(current);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the type name as it would appear in code.
|
/// Gets the type name as it would appear in code.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user