我有可能在开发过程中更改其名称(和成员)的类。(在大多数情况下)使用了我的课程,例如枚举,但是我无法使用枚举,因为我需要更多的功能。由于(显然)类(显然)没有代表它们在表面下的整数,因此我需要为具有类似功能的解决方案创建一些解决方案。换句话说,我希望每个班级都由整数(或其他一些唯一标识符)表示。
我已经创建了此属性:
public class IdAttribute : Attribute
{
private int id = -1;
public IdAttribute(int index)
{
this.id = index;
}
public int Id
{
get
{
return id;
}
}
}
我正在使用如下:
[Id(0)]
public class Hello: Core { }
[Id(1)]
public class Bye: Core { }
您可以看到这很容易出错,因为我不希望任何类具有相同的ID。因此,最佳地,我想要一个自动生成的ID,但是如果我更改有关类的任何内容,例如班级名称或其成员。
。实现这一目标的最佳方法是什么?
(我知道在Java中,一旦您制作了一个序列化的类,您就会获得自动生成的ID(C#中是否有类似的ID?)。)
编辑:我"不能"仅使用枚举的原因是因为(主要)便利。我的课程会在编辑器中揭示字段。在此编辑器中,我只能选择适当的"枚举",在某些情况下,只会显示从"核心"继承的枚举,在其他情况下,它们可能会从"工具"或其他类别中继承。我希望这清除了一点。
不确定为什么您需要这样做,但是您可以执行以下操作:
[AttributeUsage(AttributeTargets.Class)]
public class IdAttribute:Attribute
{
public Guid Id { get; }
public IdAttribute(string id)
{
Id = new Guid(id);
}
}
您会使用它:
[IdAttribute("7d7952d1-86df-4e2e-b040-fed335aad775")]
public class SomeClass
{
//example, you'd obviously cache this
public Guid Id => GetType().GetCustomAttribute<IdAttribute>().Id;
//...
}
请注意,Guid
S 不是随机的。如果您需要随机ID,则不是解决方案。要生成Guid
向您的问题读取评论。
您可以通过基础类Core
:
public abstract class Core
{
public Core()
{
Type myType = this.GetType();
object[] attrs = myType.GetCustomAttributes(typeof(IdAttribute), false);
IdAttribute attr = attrs?.OfType<IdAttribute>().FirstOrDefault();
int id = -1;
if (attr != null) id = attr.Id;
if (!reservedIdentities.ContainsKey(id))
{
reservedIdentities.Add(id, myType);
}
else
{
if (!reservedIdentities[id].Equals(myType))
throw new ArgumentException("Duplicate identities discovered.", nameof(id));
}
}
static Dictionary<int, Type> reservedIdentities = new Dictionary<int, Type>();
//...
}