让类具有唯一 ID,无论如何都不会更改



我有可能在开发过程中更改其名称(和成员)的类。(在大多数情况下)使用了我的课程,例如枚举,但是我无法使用枚举,因为我需要更多的功能。由于(显然)类(显然)没有代表它们在表面下的整数,因此我需要为具有类似功能的解决方案创建一些解决方案。换句话说,我希望每个班级都由整数(或其他一些唯一标识符)表示。

我已经创建了此属性:

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>();
    //...
}

相关内容

  • 没有找到相关文章

最新更新