У меня есть класс, который я хочу использовать для хранения «свойств» для другого класса. Эти свойства просто имеют имя и значение. В идеале я хотел бы иметь возможность добавлять типизированные свойства, чтобы возвращаемое «значение» всегда имело тот тип, который я хочу.
Тип всегда должен быть примитивным. Этот класс подклассов абстрактный класс, который в основном хранит имя и значение в виде строки. Идея состоит в том, что этот подкласс добавит некоторую безопасность типов в базовый класс (а также сэкономит мне на некотором преобразовании).
Итак, я создал класс, который (примерно) это:
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
Итак, вопрос в следующем:
Есть ли «общий» способ преобразования строки обратно в примитив?
Я не могу найти какой-либо универсальный интерфейс, который связывает преобразование по всем направлениям (что-то вроде ITryParsable было бы идеально!).
источник
Ответы:
Я не уверен, правильно ли я понял ваши намерения, но давайте посмотрим, поможет ли это.
источник
Convert.ChangeType
это не очень универсальное и расширяемое решение, оно работает для большинства основных типов. если нужно что-то лучшее, нет проблем, чтобы обернуть этот метод во что-то большее, как предложил Тим, или использовать другой метод преобразования.Метод Любоша Хаско не подходит для nullables. Метод ниже будет работать для обнуляемых. Я не придумал это, все же. Я нашел его через Google: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx Кредит "Тунец Токсоз"
Использование в первую очередь:
Класс ниже.
источник
tc
(TypeConverter
) только один раз.TypeConverter
медленный, потому что он использует отражение для поискаTypeConverterAttribute
. Если вы инициализируете одно приватноеTypeConverter
поле, вы сможете использовать егоTypeConverter
много раз.object
, выдает исключение. Я смог обойти это, используя `if (typeof (T) .IsPrimitive) {return TConverter.ChangeType <T> (StringValue); } else {object o = (object) StringValue; Вернуться к; } `в качестве замены для примера использованияTConverter.ChangeType<T>(StringValue)
Для многих типов (целое, двойное, DateTime и т. Д.) Существует статический метод Parse. Вы можете вызвать его, используя отражение:
источник
TypeDescriptor
это класс, имеющий метод,GetConvertor
который принимаетType
объект, а затем вы можете вызватьConvertFrom
метод для преобразованияvalue
указанного объекта.источник
Вы могли бы использовать такую конструкцию, как класс черт . Таким образом, у вас будет параметризованный вспомогательный класс, который знает, как преобразовать строку в значение ее собственного типа. Тогда ваш геттер может выглядеть так:
Теперь я должен отметить, что мой опыт работы с параметризованными типами ограничен C ++ и его шаблонами, но я думаю, что есть какой-то способ сделать то же самое с использованием обобщений C #.
источник
Проверьте статический
Nullable.GetUnderlyingType
. - Если базовый тип является нулевым, тогда параметр шаблона неNullable
, и мы можем использовать этот тип напрямую. - Если базовый тип не является NULL, тогда используйте базовый тип в преобразовании.Кажется, работает на меня:
источник
Вдохновленные ответом Боба , эти расширения также поддерживают преобразование нулевого значения и все примитивное преобразование назад и четвертое.
Примеры
источник
Я использую преобразование через объект. Это немного проще.
источник
Я использовал ответ Лобоса, и он работает. Но у меня была проблема с конвертацией двойников из-за настроек культуры. Итак, я добавил
источник
Еще один вариант. Обрабатывает Nullables, а также ситуации, когда строка имеет значение NULL и T не имеет значения NULL.
источник
Вы можете сделать это в одну строку, как показано ниже:
Удачного кодирования;)
источник