在C#中,如何使用集合中的键/值初始化对象

在C#中,如何使用集合中的键/值初始化对象,c#,C#,我太懒了,无法键入对象的所有属性,因此,请改为: myObj.property1 = value1; myObj.property2 = value2; myObj.property3 = value3; myObj.property4 = value4; myObj.property5 = value5; ... 有没有办法做到这一点 Object myObj = new Object(); foreach (string curProperty in myCollection.AllKey

我太懒了,无法键入对象的所有属性,因此,请改为:

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;   // ??????????????

}

是的,您需要使用
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);
}
for(int i=1;i<6;i++)
{
PropertyInfo prop=myObj.GetType().GetProperty(string.Format(“属性{0}”,i);
如果(prop==null){continue;}
prop.SetValue(myObj,集合[prop.Name],null);
}
在本例中,我假设
collection
在属性名上有一个字符串索引器(您可能需要以另一种方式恢复它)。我还假设只有5个属性(
I<6
),您需要相应地设置。但您明白了


在Jim Mischel提出的评论的精神中,序列化也是一个选择。我不打算在这里做一个例子,因为我不是100%的代码,而是考虑Web服务。Web服务的所有工作都是(DE)序列化。


因此,从技术上讲,您可以将XML文件反序列化为一个对象,这样您就可以获得反序列化的所有好处,而且还有很多好处。我能想到的一点是,在设置属性值之前,不会创建对象的新实例不确定-但我知道它已经完成了,因为我曾经追踪过这样一个bug!

您可以使用反射来完成此操作,但请记住,这将比正确执行要慢得多

应该是这样的:

var prop = typeof(SomeType).GetProperty(propertyName);
prop.SetValue(myObj, newValue, null);
Object myObj = new Object();
foreach (string curProperty in myCollection.AllKeys) {
    var property= typeof(Object).GetProperty(curProperty);
    property.SetValue(myObj, curValue, null);
}
这假定属性存在并且可以访问

您可以使用新创建的lambda并将其保存在内存中,从而显著提高性能,但编写起来有点复杂


总的来说,我会说“不要这样做”除非你只是把它作为一个练习来学习如何使用反射。

我知道这并不完全是你想要的,反射解决了你要问的特定问题;但是如果你很懒,并且你已经有了一个键/值集合,Expando对象是很棒的。这样你甚至不需要声明一个类


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

var prop = typeof(SomeType).GetProperty(propertyName);
prop.SetValue(myObj, newValue, null);
Object myObj = new Object();
foreach (string curProperty in myCollection.AllKeys) {
    var property= typeof(Object).GetProperty(curProperty);
    property.SetValue(myObj, curValue, null);
}

您可以使用反射来执行此操作,但代码的执行速度会比手动执行慢。@David,我没有发现反射在这种情况下执行速度会明显慢。当然,有时对类型执行重要的查找会比直接访问内存的某个部分花费更多的时间,但我非常确定无论性能受到什么影响,它都是可以忽略不计的。你可以通过反思来做到这一点,但除非你有很好的理由,否则你不应该这样做。(提示:懒惰不是一个很好的理由。)编辑真的有必要吗?好吧,好吧,有人告诉我不要再做程序员了,所以一想到有人做这件事就让我紧张。我意识到你只是在展示如何做,而不一定是在鼓吹实际做这件事……但。shudder@JimMischel,我构建了一些非常动态的应用程序,在这些应用程序中执行这些类型的操作,因为我不知道要配置什么。在非常简单的情况下,像这样,我没有发现性能有明显的下降-但是当你解释整个应用程序时-是的,这要慢得多。我看到了硬币的两面-并对硬币的两面进行了编程。哈哈,我做到了不过,我更喜欢当工具处理这类东西时(例如序列化)。如果该工具可以处理两个方面,我就没事了。当一个方面必须手工编写时,它就像一把上膛的枪瞄准你的脚…@JimMischel,现在这是一种看待它的方式!序列化是一种有趣的方法,现在你提到了它,如果我想到了这一点,我会使用它。将配置导出为可以修改的XML文件我将被反序列化,我将从该空间中存在的性能增强中获得所有好处。这想法太棒了!