C# 在.NET/C中隐藏值类型的实现# 请考虑我的用例:我正在开发一个软件系统,其中有不同类型(用户、文档、门票等)的唯一标识“项目”。

C# 在.NET/C中隐藏值类型的实现# 请考虑我的用例:我正在开发一个软件系统,其中有不同类型(用户、文档、门票等)的唯一标识“项目”。,c#,.net,C#,.net,我已经开始实施,虽然我想继续实施,但我不确定什么是最合适的“项目”唯一标识符。它可能是一个自动递增的整数、一个GUID、一个包含前缀的字符串+创建时间等 显然,唯一标识符类型的变量在我的所有类中都声明了,如果我以后打算更改它,那就不好了 我的问题是,是否有一个.NET机制用于typedef-ing值类型,这样我就可以在单个位置(例如,使用扩展方法)更改“real”类型和特定于类型的功能,而不必担心代码中出现的大量其他情况。不,没有。不是全球性的。但是,您可以创建基类,如: public cla

我已经开始实施,虽然我想继续实施,但我不确定什么是最合适的“项目”唯一标识符。它可能是一个自动递增的整数、一个GUID、一个包含前缀的字符串+创建时间等

显然,唯一标识符类型的变量在我的所有类中都声明了,如果我以后打算更改它,那就不好了


我的问题是,是否有一个.NET机制用于
typedef
-ing值类型,这样我就可以在单个位置(例如,使用扩展方法)更改“real”类型和特定于类型的功能,而不必担心代码中出现的大量其他情况。

不,没有。不是全球性的。但是,您可以创建基类,如:

 public class BaseEntity
 {
    public int Id { get; set; }
 }
然后从中派生所有对象:

 public class MyItem : BaseEntity
 {
 }
那么你只需要在一个地方改变你的类型

您可以为类型创建别名,但需要在每个模块上定义别名,不能全局执行:

 using MyIdType = System.Int32;
别名的文档是

也就是说:我认为改变这类事情不是一个好的做法。。。三思而后行,编写一次代码。

继承呢

如果您不能使用继承,因为您已经从知道其他类的人那里派生了这些类。。。然后可以使用泛型:

公共类用户,其中TId:IEquatable
{
公共TId Id{get;set;}
}
公共类员工,其中TId:合格
{
公共TId Id{get;set;}
}
这意味着您需要在类实例化期间提供整个唯一标识符的类型:

Employee<Guid> employee = new Employee<Guid>();
Employee=新员工();
我相信泛型更接近您所要寻找的,因为它允许您使用
Id
属性定义一组类,但在某些代码实例化整个类之前,类本身不知道正在使用什么类型的唯一标识符。显然,这有一个很大的缺点:如果要更改唯一标识符类型,则需要更改所有类实例化…


无论如何,使用诸如
(?:User | Employee | Boss | Document)
之类的regexp进行大规模查找和替换就足以更改项目中每个域类的唯一标识符的类型!)

C#没有“typedef”等价物,弱或强。还不完全清楚您想做什么——如果您能给出一个伪代码示例,它可能有助于建议替代方案。听起来像是设计用来解决的问题。@Cory:抱歉,不清楚。考虑许多具有值类型UNIQuixIdisher的ID属性的类,这实际上是一个GUID(例如)。在每个这样的类的构造函数上,我要添加Id=UniqueIdentifier.Generate();(可能是一种扩展方法)。类不需要知道Id是如何实现或生成的,我可以在不更改类代码的情况下更改UniqueIdentifier的实现。他确实说了值类型:)@CoryNelson我以为他指的是标识符是的值类型,而不是类……正确,值类型指的是唯一标识符。我目前正在使用别名,但这不是我正在寻找的单点解决方案@Jcl,即使我仔细考虑并选择GUID(例如),定义一个UniqueIdentifier类型并扩展它,而不是扩展所有的GUID(或所有字符串!)仍然是“更干净的”@ury恐怕在C#@ury中没有这样的解决方案,您可以使用
结构为id定义自己的值类型,但是,仅仅为了命名而在
struct
中有一个
Guid
int
,这在我看来是不对的,而且从远处就可以闻到味道(如果你真的在用这种类型做其他事情,这可能是一个解决方案)
public class User<TId> where TId : IEquatable<TId>
{
    public TId Id { get; set; }
}

public class Employee<TId> where TId : IEquatable<TId>
{
    public TId Id { get; set; }
}
Employee<Guid> employee = new Employee<Guid>();