如何将PropertyInfo.GetValue()结果转换为不可空的Color类型?
如何将反射获取的值转换为
System.Drawing.Color类型? 问题场景
现有如下代码(c为System.Windows.Forms.Control实例):
var properties = c.GetType().GetProperties(); foreach( var p in properties ) { if (p.PropertyType.Name.Contains("Color") ) { var colour_value = p.GetValue(c,null); // 需要将colour_value转换为Color类型 } }
尝试过两种转换方式均无效:
- 直接强制转换:
(Color) p.GetValue(c, null) - 使用
as关键字:p.GetValue(c, null) as Color
由于Color是不可空值类型,第二种方式会触发编译器错误CS0077,请问有可行的解决方法吗?
可行解决方法
1. 精准类型判断后强制转换
先通过属性的PropertyType精准判断是否为Color类型,再直接强制转换(装箱的值类型支持直接拆箱转换):
foreach( var p in properties ) { if (p.PropertyType == typeof(System.Drawing.Color)) { var colour_value = p.GetValue(c,null); System.Drawing.Color color = (System.Drawing.Color)colour_value; // 后续处理color } }
这种方式比检查Name.Contains("Color")更准确,避免误判ColorPalette这类带Color关键字的其他类型。
2. 使用Convert.ChangeType方法
该方法可统一处理装箱值类型的转换,代码更简洁:
foreach( var p in properties ) { if (p.PropertyType.Name.Contains("Color") ) { var colour_value = p.GetValue(c,null); System.Drawing.Color color = (System.Drawing.Color)Convert.ChangeType(colour_value, typeof(System.Drawing.Color)); // 后续处理color } }
补充说明
你之前遇到的编译错误仅针对as关键字(as只能用于引用类型或可空值类型),直接(Color)强制转换本身是合法的——只要GetValue返回的确实是装箱后的Color实例,编译不会报错,运行时也能正常拆箱。如果之前编译报错,大概率是代码中缺少using System.Drawing;命名空间引用。
内容的提问来源于stack exchange,提问作者Andrew17856
相关产品推荐
相关产品推荐

