如何使类型在所有意图和目的上都像字符串,因为我无法从字符串继承

问题描述 投票:1回答:1

我喜欢类型。希望能够为字符串或int等指定含义)

字符串或整数几乎可以是任何东西,

我喜欢给字符串一个有意义的类型。当您需要冗长的函数调用时,我也希望这样做。这样的人使用它不会以错误的顺序传递字符串。

我经常使用字符串作为参数,并且我希望“ MembersName”作为从字符串派生的类型。

我可以轻松地执行类似于MemberName.Value的操作,其中string是另一个类的属性。我宁愿从String派生我的课程,但由于它是密封的,所以这是不可能的。

我查看了System.String源,并考虑将其取出来使用它来创建自己的String类型,但我决定反对它。

然后,我开始在基类中创建我自己的立场,我可以从StringBase(确实很好的名称)派生其他类似字符串的类型。

我正在努力实施IEquatable,ICloneable,IComparable,IComparable,IConvertible,IEquatable,IEnumerable

在基本类型中,使其尽可能像字符串一样显示。

我希望能够使用Membername ==“ Phil Collins”。

还希望模仿String的其他功能。

这是正确的路径吗?有人写过它的版本吗?我认为必须先要有其他人提出?到目前为止,我尝试过搜索Google和GitHub并没有多大运气。

我要沿着正确的道路走吗?还是我试图做的事几乎不可能?

c# string .net-core
1个回答
0
投票

我认为这可能是一个很好的设计,因为它为不同类型的字符串提供类型安全性(可以更好地支持重载方法,重构等。

我从一个旧项目中挖了一些东西,至少可以使您入门。

在这种情况下,我有一个强类型的UserId(几乎)用作字符串。

也许如果您使用隐式运算符作为'GuruStron'来完成此操作,则您将需要做一些工作,尽管如果我没记错的话,我选择不提供隐式运算符,因为它会使类型“较少类型安全”。

public struct UserId : IStringIdentifier, IEquatable<UserId>
{
    public UserId(string id) : this() => Value = id;

    public string Value { get; set; }

    public static bool operator ==(UserId id1, UserId id2) 
        => id1.Value == id2.Value;

    public static bool operator !=(UserId id1, UserId id2) 
        => id1.Value != id2.Value;

    public override bool Equals(object obj)
    {
        if (obj is UserId other)
            return Equals(other);

        return false;
    }

    public bool Equals(UserId other) => Value.Equals(other.Value);
    public override string ToString() => Value;
    public override int GetHashCode() => Value.GetHashCode();
}

编辑:稍微整理一下。

© www.soinside.com 2019 - 2024. All rights reserved.