Обычно конвертировать объект? к Т? ⇐ C#
-
Anonymous
Обычно конвертировать объект? к Т?
У меня есть код, который работает, когда у меня есть общее ограничение where T : struct:
публичная структура только для чтения AnnotatedValue где T: структура { public AnnotatedValue (Объект? Значение, ...) { Значение = ConvertValue(значение); ... } общественный Т? Значение {получить; в этом; } ... еще объекты ... частный статический T? ConvertValue (Объект? Значение) { переключатель возвращаемого значения { ноль => ноль, T castValue => castValue, _ => (T?)Convert.ChangeType(значение, typeof(T)) }; } } Общая цель здесь — преобразовать неуниверсальный Object? в запрошенный тип (скорее всего, число, структуру или строку); если запрошенный тип является типом значения, результат должен быть заключен в Nullable для обработки пустых входных данных, а если запрошенный тип является ссылочным типом, результат может быть нулевым.
Если я удалю ограничение where T : struct, то строка null => null приведет к ошибке компилятора CS0403 Невозможно преобразовать значение null в параметр типа 'T ', потому что это может быть тип значения, не допускающий значения NULL. Вместо этого рассмотрите возможность использования default(T).
Я не хочу использовать default(T), поскольку он, скорее всего, вернет значение 0, а не значение Nullable с нулевым значением.
Контекст таков: я вызываю неуниверсальный метод в API источника данных, который возвращает Object?, где возвращаемое значение может быть нулевым, типом упакованного значения (числовым или структурным). или строка. У меня есть доступ к метаданным, которые указывают, каким будет фактический тип, но этот конкретный API возвращает его как Object?; моя цель — гибко вернуть его к строго типизированному представлению.
Если запрошенный тип является типом значения, я хотел бы преобразовать возвращаемое значение в Nullable, соответствующее запрошенному типу значения. Но если запрошенный тип — String, я хотел бы вернуть String? (который является ссылочным типом, допускающим значение NULL, и поэтому несовместим с где T: общее ограничение struct).
Есть ли способ добиться такого гибкого преобразования, не требуя от вызывающей стороны вызова другого метода в зависимости от того, является ли желаемый тип значением или ссылочным типом?
Если мне нужно реализовать разные общие методы для значения where T: struct и ссылки where T: class, есть ли способ создать метод-обертку, который будет выполнять проверки -time тип информации и вызовы того или иного метода для преобразования?
У меня есть код, который работает, когда у меня есть общее ограничение where T : struct:
публичная структура только для чтения AnnotatedValue где T: структура { public AnnotatedValue (Объект? Значение, ...) { Значение = ConvertValue(значение); ... } общественный Т? Значение {получить; в этом; } ... еще объекты ... частный статический T? ConvertValue (Объект? Значение) { переключатель возвращаемого значения { ноль => ноль, T castValue => castValue, _ => (T?)Convert.ChangeType(значение, typeof(T)) }; } } Общая цель здесь — преобразовать неуниверсальный Object? в запрошенный тип (скорее всего, число, структуру или строку); если запрошенный тип является типом значения, результат должен быть заключен в Nullable для обработки пустых входных данных, а если запрошенный тип является ссылочным типом, результат может быть нулевым.
Если я удалю ограничение where T : struct, то строка null => null приведет к ошибке компилятора CS0403 Невозможно преобразовать значение null в параметр типа 'T ', потому что это может быть тип значения, не допускающий значения NULL. Вместо этого рассмотрите возможность использования default(T).
Я не хочу использовать default(T), поскольку он, скорее всего, вернет значение 0, а не значение Nullable с нулевым значением.
Контекст таков: я вызываю неуниверсальный метод в API источника данных, который возвращает Object?, где возвращаемое значение может быть нулевым, типом упакованного значения (числовым или структурным). или строка. У меня есть доступ к метаданным, которые указывают, каким будет фактический тип, но этот конкретный API возвращает его как Object?; моя цель — гибко вернуть его к строго типизированному представлению.
Если запрошенный тип является типом значения, я хотел бы преобразовать возвращаемое значение в Nullable, соответствующее запрошенному типу значения. Но если запрошенный тип — String, я хотел бы вернуть String? (который является ссылочным типом, допускающим значение NULL, и поэтому несовместим с где T: общее ограничение struct).
Есть ли способ добиться такого гибкого преобразования, не требуя от вызывающей стороны вызова другого метода в зависимости от того, является ли желаемый тип значением или ссылочным типом?
Если мне нужно реализовать разные общие методы для значения where T: struct и ссылки where T: class, есть ли способ создать метод-обертку, который будет выполнять проверки -time тип информации и вызовы того или иного метода для преобразования?
Мобильная версия