user3228992
user3228992

Reputation: 1373

Reflections -Set objects property when the property is in a List<>

I know I can use reflection to set a objects property like this below.

    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);
    }

I'm having these classes below:

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

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

My SaveContent()-method works obviously when the property to set is, for example public string BigHeader { get; set; } But how can I do this if the the property I want to set is in the property:

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

If public List<BigLinks> BigLinks { get; set; } is a list of 5 BigLinks objects, how can a set the value of, for example the third objects public string TextContent { get; set; }?

Upvotes: 3

Views: 385

Answers (1)

brz
brz

Reputation: 6016

You have to get the property value using reflection and change the desired value like this:

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";

If you don't know the type of list item:

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

Another option is casting to dynamic:

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

Upvotes: 1

Related Questions