让班级有唯一的 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 中,一旦你创建了一个 Serializable 类,你就会得到一个自动生成的 id(在 C# 中有这样的东西吗?)。)

编辑:我“不能”只使用枚举的原因是(主要是)方便。我有在编辑器中公开字段的类。在这个编辑器中,我只能选择适当的“枚举”,在某些情况下,只会显示从“核心”继承的枚举,而在其他情况下,它们可能从“工具”或其他一些类继承。我希望澄清一点。

之间

不确定为什么需要这样做,但您可以执行以下操作:

[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小号不是随机的。如果您需要一个随机 ID,那么这不是解决方案。Guid您的问题生成阅读评论。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尽管我使用#idname选择了所有ID,但为什么所有ID都不会改变?

将数组传递给函数,因此无论如何它都不会改变原始数组

所有文本在悬停时都不会改变颜色

每个班级的唯一ID

Flutter Bloc状态无论如何都不会更新

Airflow PythonOperator 任务无论如何都不会失败

无论如何,服务都不会被杀死

当我将鼠标悬停在元素上时,为什么整个内容框都不会改变颜色?左边有空白

确保如果两个语句之一失败,则最终结果对于两个语句都不会改变

无论使用哪种主题,我的默认鼠标光标都不会改变

如何为每个班级扩展获取唯一的ID?

无论有足够的可用空间,npm都不会安装任何软件包

为什么StdDraw无论如何都不会得到认可?

无论如何,Azure 管道都不会在来自 Github 的标签上触发

无论如何,R 都不会让我更改 ggplot 上各个条的颜色

wpf中的数据网格无论如何都不会更新自身

$(this).hide(); 无论如何都不会关闭弹出div。jQuery的

每个断点的背景颜色都不会改变

setuid 标志不会改变有效的用户 ID

无论如何,Typescript都不会在tsconfig的“排除”数组中排除文件夹(TS 3.7.2)

如何查询选择一个班级的所有孩子,但没有该班级的孙子

无论如何,有没有改变clearcase视图的文本模式?

如何检查同一班级内是否有班级?

如何定义班级唯一角色是执行动作

服务器15.10-“无论启动什么服务”都不会启动/etc/init.d/中的“无论如何”系统V init脚本

如果队列中已经有东西,无论使用什么过滤器,PeekMessage都不会产生新的WM_TIMER消息吗?

为什么随机数在每次迭代中都不会改变?

使用 BCE 优化不起作用,什么都不会改变

为什么反应函数引用在每次渲染时都不会改变?