Как сделать тип, который во всех смыслах и целях действует как строка, поскольку я не могу наследовать от строки - PullRequest
3 голосов
/ 29 мая 2020

Мне нравятся типы. Например, возможность указывать значение для строки или int et. c)

Строка или int могут быть почти любыми,

Мне нравится давать строке значимый тип. Я также предпочитаю это, когда у вас есть вызов функции longi sh. Таким образом, люди, которые его используют, не будут передавать строки в неправильном порядке.

Я часто использую строки в качестве параметров и хочу, чтобы «MembersName» был типом, производным от строки.

Я легко могу сделать что-то вроде MembersName.Value, где строка - это свойство другого класса. Я бы предпочел унаследовать свой класс от String, но это невозможно, поскольку он запечатан.

Я посмотрел на источник System.String и подумал о том, чтобы использовать его для создания своего собственного типа String, но я решил против.

Затем я начал создавать свой собственный стенд в базовом классе, который мог бы унаследовать другие строковые типы от StringBase (действительно хорошее имя).

Я работаю над реализацией IEquatable , ICloneable, IComparable, IComparable, IConvertible, IEquatable, IEnumerable

В базовом типе, чтобы он выглядел как можно больше как строка.

Я бы предпочел иметь возможность Membername == "Phil Collins".

Также желательно имитировать другие функции String.

Это правильный путь? а у кого-нибудь уже написана его версия? Я полагаю, что потребность, должно быть, возникла раньше от кого-то другого?
Пока я безуспешно пытался найти Google и GitHub.

Я иду правильным путем? Или то, что я пытаюсь сделать, практически невозможно?

1 Ответ

3 голосов
/ 29 мая 2020

Я думаю, что это может быть хорошим дизайном, поскольку он обеспечивает безопасность типов для разных типов строк (улучшая поддержку методов перегрузки, рефакторинга и т. Д. c.).

Я откопал кое-что из старого проект, который может помочь вам хотя бы начать работу.

В этом случае у меня был строго типизированный 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();
}

Изменить: Немного подчистил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...