using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace ConsoleApp3
{
public class BaseFoo
{
protected bool Changed { get; set; } = false;
public bool IsModified()
{
return Changed;
}
}
public class IntFoo : BaseFoo
{
private int _value;
public int Value
{
get
{
return _value;
}
set
{
Changed = true;
_value = value;
}
}
public IntFoo(int value)
{
_value = value;
}
}
public class BoolFoo : BaseFoo
{
private bool _value;
public bool Value
{
get
{
return _value;
}
set
{
Changed = true;
_value = value;
}
}
public BoolFoo(bool value)
{
_value = value;
}
}
public class Bar
{
public IntFoo CustomInt { get; set; } = new IntFoo(5);
public BoolFoo CustomBool { get; set; } = new BoolFoo(false);
}
class Program
{
static void Main(string[] args)
{
var changed = false;
var bar = new Bar();
bar.CustomBool.Value = true;
var props = bar.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x=> x.PropertyType.BaseType == typeof(BaseFoo));
foreach (var prop in props)
{
if (((BaseFoo)prop.GetValue(bar)).IsModified())
changed = true;
}
Console.WriteLine(changed);
Console.ReadLine();
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgU3lzdGVtLlhtbDsKCm5hbWVzcGFjZSBDb25zb2xlQXBwMwp7CiAgICBwdWJsaWMgY2xhc3MgQmFzZUZvbwogICAgewogICAgICAgIHByb3RlY3RlZCBib29sIENoYW5nZWQgeyBnZXQ7IHNldDsgfSA9IGZhbHNlOwogICAgICAgIHB1YmxpYyBib29sIElzTW9kaWZpZWQoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIENoYW5nZWQ7CiAgICAgICAgfQogICAgfQogICAgcHVibGljIGNsYXNzIEludEZvbyA6IEJhc2VGb28KICAgIHsKICAgICAgICBwcml2YXRlIGludCBfdmFsdWU7CgogICAgICAgIHB1YmxpYyBpbnQgVmFsdWUKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHB1YmxpYyBJbnRGb28oaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7CgogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgY2xhc3MgQm9vbEZvbyA6IEJhc2VGb28KICAgIHsKICAgICAgICBwcml2YXRlIGJvb2wgX3ZhbHVlOwoKICAgICAgICBwdWJsaWMgYm9vbCBWYWx1ZQogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHVibGljIEJvb2xGb28oYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOwoKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGNsYXNzIEJhcgogICAgewogICAgICAgIHB1YmxpYyBJbnRGb28gQ3VzdG9tSW50IHsgZ2V0OyBzZXQ7IH0gPSBuZXcgSW50Rm9vKDUpOwogICAgICAgIHB1YmxpYyBCb29sRm9vIEN1c3RvbUJvb2wgeyBnZXQ7IHNldDsgfSA9IG5ldyBCb29sRm9vKGZhbHNlKTsKICAgIH0KCgogICAgY2xhc3MgUHJvZ3JhbQogICAgewogICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBiYXIgPSBuZXcgQmFyKCk7CgogICAgICAgICAgICBiYXIuQ3VzdG9tQm9vbC5WYWx1ZSA9IHRydWU7CgoKICAgICAgICAgICAgdmFyIHByb3BzID0gYmFyLkdldFR5cGUoKS5HZXRQcm9wZXJ0aWVzKEJpbmRpbmdGbGFncy5QdWJsaWMgfCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UpLldoZXJlKHg9PiB4LlByb3BlcnR5VHlwZS5CYXNlVHlwZSA9PSB0eXBlb2YoQmFzZUZvbykpOwogICAgICAgICAgICBmb3JlYWNoICh2YXIgcHJvcCBpbiBwcm9wcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCgoQmFzZUZvbylwcm9wLkdldFZhbHVlKGJhcikpLklzTW9kaWZpZWQoKSkKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShjaGFuZ2VkKTsKICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOwogICAgICAgIH0KICAgIH0KCgp9Cg==