大家好我正在尝试将两个对象转换为基于属性反射信息的特定类型。我想动态地这样做,所以我不需要一堆切换案例,对于每个类型,这两个对象可以在这个类中。总的来说,他们大多数是int或float。目前,我目前尝试使用'var'和'object'关键字来保存传入的调整值和属性原始值。
// .. snip
/* Get property information. */
PropertyInfo propInfo = classObj.GetType().GetProperty("property-name");
if (propInfo == null)
continue;
/* Prepare object values. */
object orgVal = propInfo.GetValue( classObj, null );
object adjVal = Convert.ChangeType( strAdjust, propInfo.GetType(), new CultureInfo("en-us"));
// .. math on objects here
// ex. orgVal += adjVal;
// .. snip
传入的调整值是字符串,但是以“int”或“float”格式,因此很容易转换。所有这一切都很好,只是允许使用新的调整值来调整原始值的转换。
我知道在.NET 4.0中有'动态'关键字能够完成这样的事情,但目前我仍然坚持使用3.5。
两个对象都将使用属性信息propInfo.GetType()中的类型。
对此有任何帮助将不胜感激,我相信我可能会忽略一个基本的事情来实现这一目标。提前谢谢。
-CK
编辑:
忘了提,抱歉,这是在Zune HD上开发的,所以我可以访问的框架相当于可以/不能使用的框架。
答案 0 :(得分:2)
C#3.5有一个名为TypeConverter的类 http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx
这些提供了一种根据类型信息从一种类型转换为另一种类型的机制。
System.ComponentModel.TypeConverter GetConverter(System.Type type)
用于获取转换器和
public object TypeConverter.ConvertFrom(object value)
进行转换。有基本类型的内置转换器,如int和float,并且可以为您自己的类型编写自定义转换器。
Microsoft提供了在此处编写它们的指南。 http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx
答案 1 :(得分:0)
我能想到有几种方法可以做到这一点。您可以使用反射来获取“op_Addition”方法(基本上是“operator +”)。但我这样做的方式是通过Lambdas:
var orgValueParam = Expression.Parameter(propInfo.PropertyType, "lhs");
var adjValueParam = Expression.Parameter(propInfo.PropertyType, "rhs");
var expr = Expression.Add(orgValueParam, adjValueParam);
var func = Expression.Lambda(expr, orgValueParam, adjValueParam).Compile();
var result = func(orgValue, adjValue);
注意:我实际上没有测试过这个,所以我不知道它是否可以肯定,但那是我开始的地方......