在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; // ??????????????
}
是的,你需要使用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