1

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

4

2 回答 2

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

于 2010-03-09T23:09:27.817 回答
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);

注意:我还没有实际测试过这个,所以我不知道它是否会起作用,但这就是我要开始的地方......

于 2010-03-09T23:05:18.797 回答