动态投射对象

时间:2010-03-09 22:54:06

标签: c# .net object properties dynamic-cast

大家好我正在尝试将两个对象转换为基于属性反射信息的特定类型。我想动态地这样做,所以我不需要一堆切换案例,对于每个类型,这两个对象可以在这个类中。总的来说,他们大多数是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上开发的,所以我可以访问的框架相当于可以/不能使用的框架。

2 个答案:

答案 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);

注意:我实际上没有测试过这个,所以我不知道它是否可以肯定,但那是我开始的地方......