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

本文关键字:初始化 对象 集合 何用 | 更新日期: 2023-09-27 18:05:54

我懒得输入对象的所有属性,所以改成:

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

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

是的,你需要使用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文件反序列化为对象,并且您将获得反序列化的所有好处-而且有相当多的好处。我能想到的一个问题是,在设置属性值之前,对象的新实例没有被创建——框架是如何做到的我不确定——但我知道它已经完成了,因为我曾经追踪过一个错误 !

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

应该是这样的:

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

假设该属性存在且可访问。

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

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

使用系统。反射和代码看起来像这样:

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

我知道这不是你所要求的,反思解决了你所要求的具体问题;但是Expando对象是伟大的,如果你是懒惰的,你已经有一个键/值集合。这样你根本不需要声明一个类!!

ExpandoObject