invalid cast from system.string to system.nullable 转换可空类型报错

本文探讨了在C#中使用ChangeType方法转换Nullable类型时遇到的invalidcast错误,并提供了有效的解决策略,包括如何正确处理空值和非空值情况。
部署运行你感兴趣的模型镜像

今天在工作遇到了 Convert.ChangeType 类型转换报错的问题,报错的提示信息是invalid cast from system.string to system.nullable

查资料发现ChangeType转换可空类型和转换其它类型是不同的,需要分别转换

原代码为:

1  Type t=Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");
2 DateTime date=DateTime.Now;
3 date=Convert.ChangeType("1990-01-01",t);

 

ChangeType方法执行的时候会报错,

解决方法:

 1 Type t=Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");
 2 DateTime date=DateTime.Now;
 3 
 4 if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
 5 {
 6     if (String.IsNullOrEmpty(s))
 7         date = null;
 8     else
 9         date = Convert.ChangeType(s, t.GetGenericArguments()[0]);
10 }
11 else
12 {
13   date=Convert.ChangeType("1990-01-01",t);      
14 }

 

转载于:https://www.cnblogs.com/shiguangfeia/p/3206604.html

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

CS0102 类型MainForm”已经包含“components”的定义 CS0102类型MainForm已经包含“components”的定义 CS0102类型“MainForm"已经包含components”的定义 CS0111类型MainForm”已定义了一个名为“InitializeComponent”的具有相同参数类型的成员 CS0111类型“MainForm”已定义了一个名为“InitializeComponent”的具有相同参数类型的成员 CS0111类型“MainForm”已定义了一个名为“InitializeComponent”的具有相同参数类型的成员 CS0111类型“MainForm”已定义了一个名为“Dispose”的具有相同参数类型的成员 CS0111类型“MainForm”已定义了一个名为“Dispose”的具有相同参数类型的成员 CS0111类型“MainForm”已定义了一个名为“Dispose”的具有相同参数类型的成员 CS0246未能找到类型或命名空间名“TypeDefinition”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ReaderParameters(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“Mono”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“Mono”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ModuleDefinition”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“MethodDefinition”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“MethodDefinition”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“MethodDefinition”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ManagementObject”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ManagementObject”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ManagementObject”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ManagementObjectSearcher”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ManagementObjectSearcher”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ManagementObjectSearcher”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ManagementObjectSearcher”(是否缺少using 指令或程序集引用?) CS0246名' ManagementObjectSearcher"( using?序用?) CS0246未能找到类型或命名空间名“ManagementObjectSearcher”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“Instruction”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“Instruction”(是否缺少using 指令或程序集引用?) CS0246未能找到类型或命名空间名“ILProcessor”(是否缺少using指令或程序集引用?) CS0103当前上下文中不存在名称AssemblyDefinition" CS0229在MainForm.components和MainForm.components之间具有二义性 CS0229在MainForm.components和MainForm.components之间具有二义性 CS0229在MainForm.components和MainForm.components之间具有二义性 CS0229在MainForm.components和MainForm.components”之间具有二义性 CS0121以下方法或属性之间的调用具有二义性:“MainForm.InitializeComponent()“和MainForm.InitializeComponent()” CS1061“MainForm”未包含“Form2_Load”的定义,并且找不到可接受第一个“MainForm”类型参数的可访问扩展方法“Form2_Load”(是否缺少using 指令或程序集引用?) CS0115“Form1.Dispose(bool):没有找到适合的方法来重写
最新发布
09-17
### ArgumentException 错误分析及解决方案 当出现 `ArgumentException` 错误提示 `Could not cast or convert from System.String to Common.Data.ItemDefine` 时,表明程序尝试将一个字符串类型的值转换为自定义类型 `Common.Data.ItemDefine`,但未能成功完成转换。以下是问题的详细分析与解决方案。 --- #### 问题原因分析 1. **类型不匹配** 程序中可能使用了错误的转换逻辑,试图直接将字符串值强制转换为复杂类型 `Common.Data.ItemDefine`。这种操作在 .NET 中通常会失败,因为字符串和复杂类型之间没有隐式或显式的转换机制[^1]。 2. **缺少自定义转换器** 如果需要将字符串转换为自定义类型 `Common.Data.ItemDefine`,必须提供相应的转换逻辑。如果没有实现必要的类型转换方法(如 `Parse` 或 `Convert` 方法),则会导致运行时错误[^2]。 3. **数据源问题** 数据源中的值可能不符合预期格式,例如字符串内容为空、格式错误或包含无效字符。这会导致解析失败并抛出异常[^3]。 --- #### 解决方案 以下是解决该问题的具体方法: #### 方法一:实现自定义类型转换 如果需要将字符串转换为 `Common.Data.ItemDefine` 类型,可以在 `ItemDefine` 类中添加静态方法 `Parse` 或扩展方法来支持这种转换。 ```csharp public class ItemDefine { public string Name { get; set; } public int Value { get; set; } // 实现 Parse 方法以支持从字符串转换 public static ItemDefine Parse(string input) { if (string.IsNullOrEmpty(input)) { throw new ArgumentException("Input cannot be null or empty."); } // 假设输入格式为 "Name:Value" 的字符串 var parts = input.Split(':'); if (parts.Length != 2 || !int.TryParse(parts[1], out int value)) { throw new FormatException("Invalid input format. Expected 'Name:Value'."); } return new ItemDefine { Name = parts[0].Trim(), Value = value }; } } ``` 调用示例: ```csharp string input = "Example:42"; ItemDefine item = ItemDefine.Parse(input); ``` --- #### 方法二:使用泛型转换器 如果需要更灵活的转换方式,可以使用 `TypeConverter` 类来注册自定义转换逻辑。 ```csharp using System.ComponentModel; public class ItemDefineConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) { return true; } return base.CanConvertFrom(context, sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string stringValue) { var parts = stringValue.Split(':'); if (parts.Length != 2 || !int.TryParse(parts[1], out int valueInt)) { throw new FormatException("Invalid input format. Expected 'Name:Value'."); } return new ItemDefine { Name = parts[0].Trim(), Value = valueInt }; } return base.ConvertFrom(context, culture, value); } } ``` 注册转换器: ```csharp [TypeConverter(typeof(ItemDefineConverter))] public class ItemDefine { public string Name { get; set; } public int Value { get; set; } } ``` --- #### 方法三:验证数据源格式 在进行类型转换之前,确保数据源中的值符合预期格式。可以通过正则表达式或其他验证逻辑提前过滤掉无效数据。 ```csharp string input = "Example:42"; if (string.IsNullOrEmpty(input) || !Regex.IsMatch(input, @"^\w+:\d+$")) { throw new ArgumentException("Invalid input format."); } var parts = input.Split(':'); ItemDefine item = new ItemDefine { Name = parts[0].Trim(), Value = int.Parse(parts[1]) }; ``` --- #### 方法四:使用 JSON 或 XML 序列化 如果 `ItemDefine` 是一个复杂对象,可以考虑使用 JSON 或 XML 序列化/反序列化工具(如 `System.Text.Json` 或 `Newtonsoft.Json`)来完成字符串到对象的转换。 示例代码: ```csharp using System.Text.Json; string json = "{\"Name\":\"Example\",\"Value\":42}"; ItemDefine item = JsonSerializer.Deserialize<ItemDefine>(json); ``` --- ### 注意事项 1. **异常处理** 在转换过程中,务必添加适当的异常处理逻辑,以避免因数据格式错误导致程序崩溃[^4]。 2. **单元测试** 对转换逻辑进行充分的单元测试,确保其能够正确处理各种边界情况和异常输入[^5]。 3. **性能优化** 如果需要频繁执行字符串到对象的转换操作,建议对转换逻辑进行性能优化,避免不必要的开销。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值