如何动态设置属性名称/值

本文关键字:属性 设置 何动态 动态 | 更新日期: 2023-09-27 18:10:22

嗨,我不确定我是否正确地描述了它,但是基于字符串列表,我想设置属于对象的属性值(所有属性,都是对象,与字符串名称匹配):

var _parentObject = _parentObjectService.GetParentObject(viewModel.Id);
var _listOfPropertyNames = GetPropertyNames();
foreach (var item in _listOfPropertyNames)
{
// Pseudo code, I know it's gibberish:
_parentObject.Tests.[item] = viewModel.Tests.[item];
}

希望这是有意义的,如果不是,请告诉我。

谢谢。

如何动态设置属性名称/值

听起来你在寻找AutoMapper,它会为你做这一切:

//Once:
Mapper.CreateMap<FromType, ToType>();
//Then:
Mapper.Map(viewModel.Tests, _parentObject.Tests);

如果你想自己做,你需要反射(慢)或编译表达式树(快)。

使用反射来设置属性值,如下所示:

非常简单的例子:

void SetParamByName(object obj, string paramName, object value)
{
    obj.GetType()
        .InvokeMember(
            paramName,
            BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
            Type.DefaultBinder,
            obj,
            value
        );
}