反射 - 当属性在List<>中时设置对象属性

时间:2014-09-08 19:40:33

标签: c# system.reflection

我知道我可以使用反射来设置如下所示的对象属性。

    public void SaveContent(string propertyName, string contentToUpdate, string corePageId)
    {
        var page = Session.Load<CorePage>(corePageId);
        Type type = page.GetType();
        PropertyInfo prop = type.GetProperty(propertyName);
        prop.SetValue(page, contentToUpdate, null);
    }

我有以下这些课程:

public class CorePage
{
    public string BigHeader { get; set; }
    public List<BigLinks> BigLinks { get; set; }
}

 public class BigLinks
{
    public string TextContent { get; set; }
}

我的SaveContent() - 方法显然适用于要设置的属性,例如public string BigHeader { get; set; } 但是,如果我想要设置的属性位于属性中,我该怎么做呢:

public List<BigLinks> BigLinks { get; set; }

如果public List<BigLinks> BigLinks { get; set; }是5个BigLinks个对象的列表,那么如何设置值,例如第三个对象public string TextContent { get; set; }

1 个答案:

答案 0 :(得分:1)

您必须使用反射获取属性值并更改所需的值,如下所示:

var c = new CorePage() { BigLinks = new List<BigLinks> { new BigLinks { TextContent = "Y"}}};
var r = typeof(CorePage).GetProperty("BigLinks").GetGetMethod().Invoke(c, null) as List<BigLinks>;
    r[0].TextContent = "X";

如果您不知道列表项的类型:

var itemInList = (typeof(CorePage).GetProperty("BigLinks").GetGetMethod().Invoke(c, null) as IList)[0];
itemInList.GetType().GetProperty("TextContent").SetValue(itemInList, "XXX", null);

另一种选择是投射到动态:

var itemInList = (typeof(CorePage).GetProperty("BigLinks").GetGetMethod().Invoke(c, null) as dynamic)[0].TextContent = "XXXTTT";