mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-11-13 00:55:55 +08:00
add metaID for generic types
This commit is contained in:
parent
e34016a312
commit
2fd88037f8
@ -1,6 +1,7 @@
|
|||||||
using DCFApixels.DragonECS.Internal;
|
using DCFApixels.DragonECS.Internal;
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace DCFApixels.DragonECS
|
namespace DCFApixels.DragonECS
|
||||||
{
|
{
|
||||||
@ -14,16 +15,16 @@ namespace DCFApixels.DragonECS
|
|||||||
{
|
{
|
||||||
Throw.ArgumentNull(nameof(id));
|
Throw.ArgumentNull(nameof(id));
|
||||||
}
|
}
|
||||||
if (id.Contains(','))
|
if (MetaID.IsGenericID(id) == false)
|
||||||
{
|
{
|
||||||
Throw.ArgumentException($"Аргумент {nameof(id)} не может содержать символ запятой ','");
|
Throw.ArgumentException($"Иентификатор {id} содержит не допустимые символы: ,<>");
|
||||||
}
|
}
|
||||||
id = string.Intern(id);
|
id = string.Intern(id);
|
||||||
ID = id;
|
ID = id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class MetaIDUtility
|
public static class MetaID
|
||||||
{
|
{
|
||||||
[ThreadStatic]
|
[ThreadStatic]
|
||||||
private static Random _randon;
|
private static Random _randon;
|
||||||
@ -32,6 +33,11 @@ namespace DCFApixels.DragonECS
|
|||||||
[ThreadStatic]
|
[ThreadStatic]
|
||||||
private static bool _isInit;
|
private static bool _isInit;
|
||||||
|
|
||||||
|
public static bool IsGenericID(string id)
|
||||||
|
{
|
||||||
|
return Regex.IsMatch(id, @"^[^,<>\s]*$");
|
||||||
|
}
|
||||||
|
|
||||||
public static unsafe string GenerateNewUniqueID()
|
public static unsafe string GenerateNewUniqueID()
|
||||||
{
|
{
|
||||||
if (_isInit == false)
|
if (_isInit == false)
|
||||||
@ -56,9 +62,13 @@ namespace DCFApixels.DragonECS
|
|||||||
|
|
||||||
return BitConverter.ToString(_buffer).Replace("-", "");
|
return BitConverter.ToString(_buffer).Replace("-", "");
|
||||||
}
|
}
|
||||||
public static unsafe string GenerateNewUniqueIDWithAttribute()
|
public static string IDToAttribute(string id)
|
||||||
{
|
{
|
||||||
return $"[MetaID(\"{GenerateNewUniqueID()}\")]";
|
return $"[MetaID(\"id\")]";
|
||||||
|
}
|
||||||
|
public static string GenerateNewUniqueIDWithAttribute()
|
||||||
|
{
|
||||||
|
return IDToAttribute(GenerateNewUniqueID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -498,11 +498,16 @@ namespace DCFApixels.DragonECS
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_idTypePairs.TryGetValue(atr.ID, out Type otherType) && type != otherType) //этот ексепшен не работает, так как атрибуты не кешируются а пересоздаются
|
string id = atr.ID;
|
||||||
|
if (type.IsGenericType && type.IsGenericTypeDefinition == false)
|
||||||
{
|
{
|
||||||
Throw.Exception($"Types {type.Name} and {otherType.Name} have duplicate MetaID identifiers.");
|
id = $"{id}<{string.Join(", ", type.GetGenericArguments().Select(o => GetMetaID(o)))}>";
|
||||||
}
|
}
|
||||||
_idTypePairs.Add(atr.ID, type);
|
if (_idTypePairs.TryGetValue(id, out Type otherType) && type != otherType) //этот ексепшен не работает, так как атрибуты не кешируются а пересоздаются
|
||||||
|
{
|
||||||
|
Throw.Exception($"Types {type.ToMeta().TypeName} and {otherType.ToMeta().TypeName} have duplicate {atr.ID} MetaID.");
|
||||||
|
}
|
||||||
|
_idTypePairs[atr.ID] = type;
|
||||||
return atr.ID;
|
return atr.ID;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user