最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
asp.net C# 反射设置未知类型字段的值
时间:2016-03-11 编辑:简简单单 来源:一聚教程网
只需要使用Convert.ChangeType即可
C#
var eval = new DataTable();
var objType = order.GetType();
var propertyVal = objType.GetProperty(propertyName[1]);
if (propertyVal != null)
{
var val = propertyVal.GetValue(order, null).ToString();
//TODO: 神奇的方法
var result = eval.Compute(
$"{val} {action["Expression"].Value
"");
propertyVal.SetValue(order, Convert.ChangeType(result, propertyVal.PropertyType), null);
}
想知道ChangeType是怎么实现的?其实就是封装了一堆判断hhhh
C#
public static object ChangeType(object value, TypeCode typeCode, IFormatProvider provider)
{
if (value == null && (typeCode == TypeCode.Empty || typeCode == TypeCode.String || typeCode == TypeCode.Object))
{
return null;
}
IConvertible convertible = value as IConvertible;
if (convertible == null)
{
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible"));
}
switch (typeCode)
{
case TypeCode.Empty:
{
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_Empty"));
}
case TypeCode.Object:
{
return value;
}
case TypeCode.DBNull:
{
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_DBNull"));
}
case TypeCode.Boolean:
{
return convertible.ToBoolean(provider);
}
case TypeCode.Char:
{
return convertible.ToChar(provider);
}
case TypeCode.SByte:
{
return convertible.ToSByte(provider);
}
case TypeCode.Byte:
{
return convertible.ToByte(provider);
}
case TypeCode.Int16:
{
return convertible.ToInt16(provider);
}
case TypeCode.UInt16:
{
return convertible.ToUInt16(provider);
}
case TypeCode.Int32:
{
return convertible.ToInt32(provider);
}
case TypeCode.UInt32:
{
return convertible.ToUInt32(provider);
}
case TypeCode.Int64:
{
return convertible.ToInt64(provider);
}
case TypeCode.UInt64:
{
return convertible.ToUInt64(provider);
}
case TypeCode.Single:
{
return convertible.ToSingle(provider);
}
case TypeCode.Double:
{
return convertible.ToDouble(provider);
}
case TypeCode.Decimal:
{
return convertible.ToDecimal(provider);
}
case TypeCode.DateTime:
{
return convertible.ToDateTime(provider);
}
case TypeCode.Object | TypeCode.DateTime:
{
throw new ArgumentException(Environment.GetResourceString("Arg_UnknownTypeCode"));
}
case TypeCode.String:
{
return convertible.ToString(provider);
}
default:
{
throw new ArgumentException(Environment.GetResourceString("Arg_UnknownTypeCode"));
}
}
}
上面的代码不知道各位朋友有没有看懂哦,做起来其实是非常的简单了就一个条件判断了。
相关文章
- C#复制数组的两种方式及效率比较解读 10-24
- ASP.NET Identity用法解析 10-24
- ASP.NET MVC使用Identity增删改查用户介绍 10-24
- C语言中atoi函数模拟实现介绍 10-18
- .Net反向代理组件Yarp用法介绍 10-10
- .NET使用YARP通过编码方式配置域名转发实现反向代理教程 10-10