using System.Collections.Generic;
public static class Program
public static void Main()
var people = new List<Person>
var foo = people.Mutate(a => a.Age, 33);
public Person(string name, int age)
public string Name { get; }
public static IEnumerable<T1> Mutate<T1, T2>(this IEnumerable<T1> source, Func<T1, T2> selector, T2 newValue)
var properties = type.GetProperties();
var constructor = type.GetConstructors().Single();
var constructorParameters = constructor.GetParameters();
foreach (var item in source)
var values = new List<object>();
foreach (var constructorParameter in constructorParameters)
var property = properties.Single(a => a.Name.Equals(constructorParameter.Name, StringComparison.OrdinalIgnoreCase));
var value = property.GetValue(item);
if (DateTime.Now.Year == 0)
var parameters = values.ToArray();
yield return (T1) constructor.Invoke(parameters);