Расширение System.Convert

System.Convert имеет действительно полезную утилиту для преобразования типов данных из одного типа в другой. В моем проекте у меня много настраиваемых типов. Я хочу преобразовать аргументы командной строки в эти настраиваемые типы (некоторые из которых довольно сложны). Было бы неплохо, если бы они существовали в System.Convert, поэтому я мог бы просто сделать что-то вроде этого:

Convert.ToMyCustomType(args[1])

Я хотел бы, чтобы это отображалось в Visual С# IDE по мере ввода. Я знаю, что я мог бы просто создать подпрограмму для преобразования типов, но мне хотелось бы, чтобы преобразования типов обрабатывались так же, как и уже встроенные в фреймворк. Кто-нибудь имел успех в прошлом?

Ответ 1

Нет, вы не можете добавить их в класс Convert - я бы предложил добавить методы преобразования к вашим фактическим типам, например

MyCustomType.FromInt32(...)

и методы экземпляра идут другим путем:

int x = myCustomType.ToInt32();

(Статические методы factory часто лучше, чем добавление множества перегруженных конструкторов IMO. Они позволяют различные альтернативы, включая возврат нулевого значения, где это необходимо, или кэширование - и могут сделать код вызова более понятным.)

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

Ответ 2

К сожалению, System.Convert - это статический класс, и вы не можете распространять статические классы. Вы можете выводить только статические классы из object.


Возможный путь - предоставить операторы преобразования (неявные или явные)

public class MyClass
{
    public static explicit operator MyClass(SomeOtherType other)
    {
        return new MyClass { /* TODO: provide a conversion here*/ };
    }

    public static explicit operator SomeOtherType(MyClass x)
    {
        return new SomeOtherType {  /* TODO: provide a conversion here*/ };
    }
}

С помощью этого объявления вы можете сделать это

MyClass myClass = new MyClass();
SomeOtherType other = (SomeOtherType)myClass;

или

SomeOtherType other = new SomeOtherType();
MyClass myClass = (MyClass)other;

Ответ 3

Во-первых, System.Convert не является пространством имен; это статический класс (дополнительную информацию см. в документации). Вы можете написать свой собственный класс Convert!

static class Convert
{
    static MyCustomType ToMyCustomType(string value)
    {
         //logic here...
    }
}

Если вы хотите использовать этот класс в том же файле, где вы используете System.Convert, вы можете указать ему другое имя, чтобы уменьшить двусмысленность.

Ответ 4

Convert - это статический класс, который вы не можете продлить.

Однако вы можете использовать Convert.ChangeType() для своих нужд.