Расширение 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()
для своих нужд.