-3

我懒得输入对象的所有属性,所以不要这样:

myObj.property1 = value1;
myObj.property2 = value2;
myObj.property3 = value3;
myObj.property4 = value4;
myObj.property5 = value5;
...

有没有办法做到这一点?

Object myObj = new Object();
foreach (string curProperty in myCollection.AllKeys) {
    var curValue = collection[curProperty];
    myObj[curProperty] = curValue;   // ??????????????

}
4

4 回答 4

3

是的,您需要使用System.Reflection来完成工作:

for (int i = 1; i < 6; i++)
{
    PropertyInfo prop = myObj.GetType().GetProperty(string.Format("property{0}", i);
    if (prop == null) { continue; }
    prop.SetValue(myObj, collection[prop.Name], null);
}

在此示例中,我假设collection属性名称上有一个字符串索引器(您可能需要以不同的方式恢复它)。我还假设只有 5 个属性 ( i < 6),您需要相应地进行设置。但你明白了。


本着 Jim Mischel 的评论精神,序列化也是一种选择。我不打算在这里举一个例子,因为我不是 100% 了解代码,但考虑 Web 服务。Web 服务通过(反)序列化完成所有工作。

因此,您可以在技术上将 XML 文件反序列化为对象,并且您将获得反序列化的所有好处——而且还有很多。我能想到的一个是在设置属性值之前没有创建对象的新实例——我不确定框架是如何做到的——但我知道它已经完成了,因为我追逐一次像这样的错误

于 2013-03-26T18:42:18.333 回答
1

使用 System.Reflection,代码如下所示:

Object myObj = new Object();
foreach (string curProperty in myCollection.AllKeys) {
    var property= typeof(Object).GetProperty(curProperty);
    property.SetValue(myObj, curValue, null);
}
于 2013-03-26T18:53:25.157 回答
1

您可以通过反射来做到这一点,但请记住,这将比正确执行要慢得多。

它应该是这样的:

var prop = typeof(SomeType).GetProperty(propertyName);
prop.SetValue(myObj, newValue, null);

这假定该属性存在并且可以访问。

您可以使用表达式树并将新创建的 lambdas 保存在内存中来显着提高性能,但编写起来有点复杂。

总的来说,我会说“不要这样做”,除非您只是将其用作学习如何使用反射的练习。

于 2013-03-26T18:43:32.370 回答
0

I know it is not exactly what you are asking for and reflection solves the specific question you are asking; but the Expando object is great if you are lazy and you already have a key/value collection. This way you don't even need to declare a class at all!!!

ExpandoObject

于 2013-03-26T18:50:16.987 回答