using System.Collections.Generic;
using System.Collections;
public static void Main()
var coisa1 = new MyClass3
MyProperty1 = "Valor Original 1",
MyProperty2 = new MyClass1
MyProperty = "Valor Original 2"
MyProperty3 = new List<MyClass2>
MyProperty = "Valor Original 3"
Console.WriteLine("--- Valores Originais ---");
Console.WriteLine(coisa1.MyProperty1);
Console.WriteLine(coisa1.MyProperty2.MyProperty);
Console.WriteLine(coisa1.MyProperty3.First().MyProperty);
Console.WriteLine("--- Novos Valores ---");
Console.WriteLine(coisa1.MyProperty1);
Console.WriteLine(coisa1.MyProperty2.MyProperty);
Console.WriteLine(coisa1.MyProperty3.First().MyProperty);
public static class CoisableExt
public static void Coise(this Coisable coisableClass)
foreach (var propertyInfo in coisableClass.GetType().GetProperties())
if(typeof(string).IsAssignableFrom(propertyInfo.PropertyType))
var propValue = propertyInfo.GetValue(coisableClass, null).ToString();
propValue = "Novo Valor";
propertyInfo.SetValue(coisableClass, propValue, null);
else if(typeof(Coisable).IsAssignableFrom(propertyInfo.PropertyType))
var classPropValue = propertyInfo.GetValue(coisableClass, null) as Coisable;
else if (typeof(IEnumerable<Coisable>).IsAssignableFrom(propertyInfo.PropertyType))
var classPropValueList = (propertyInfo.GetValue(coisableClass, null) as IEnumerable<Coisable>)?.ToList() ?? default(List<Coisable>);
if(classPropValueList != null && classPropValueList.Any())
classPropValueList.ForEach(classPropValueItem =>
classPropValueItem.Coise();
public class Coisable { }
public class MyClass1 : Coisable
public string MyProperty { get; set; }
public class MyClass2 : Coisable
public string MyProperty { get; set; }
public class MyClass3 : Coisable
public string MyProperty1 { get; set; }
public MyClass1 MyProperty2 { get; set; }
public List<MyClass2> MyProperty3 { get; set; }