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 Foo<T>
{
private bool isModified=false;
private T _value;
public T Value
{
get
{
return _value;
}
set
{
isModified = true;
_value = value;
}
}
public Foo(T value)
{
_value = value;
}
public bool IsModified()
{
return isModified;
}
}
public class Bar
{
public Foo<int> CustomInt { get; set; } = new Foo<int>(5);
public Foo<bool> CustomBool { get; set; } = new Foo<bool>(false);
}
class Program
{
static void Main(string[] args)
{
var changed = false;
var bar = new Bar();
bar.CustomBool.Value = true;
var qqq = bar.GetType().GetProperties();
var props = bar.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericTypeDefinition()==typeof(Foo<>) );
foreach (var prop in props)
{
if ((bool)(prop.PropertyType.GetMethod("IsModified").Invoke(prop.GetValue(bar), new object[] { })))
changed = true;
}
Console.WriteLine(changed);
Console.ReadLine();
}
}
public class TestController
{
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgU3lzdGVtLlhtbDsKCm5hbWVzcGFjZSBDb25zb2xlQXBwMwp7CiAgICBwdWJsaWMgY2xhc3MgRm9vPFQ+CiAgICB7CiAgICAgICAgcHJpdmF0ZSBib29sIGlzTW9kaWZpZWQ9ZmFsc2U7CiAgICAgICAgcHJpdmF0ZSBUIF92YWx1ZTsKCiAgICAgICAgcHVibGljIFQgVmFsdWUKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpc01vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHB1YmxpYyBGb28oVCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOwoKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcHVibGljIGJvb2wgSXNNb2RpZmllZCgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gaXNNb2RpZmllZDsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGNsYXNzIEJhcgogICAgewogICAgICAgIHB1YmxpYyBGb288aW50PiBDdXN0b21JbnQgeyBnZXQ7IHNldDsgfSA9IG5ldyBGb288aW50Pig1KTsKICAgICAgICBwdWJsaWMgRm9vPGJvb2w+IEN1c3RvbUJvb2wgeyBnZXQ7IHNldDsgfSA9IG5ldyBGb288Ym9vbD4oZmFsc2UpOwogICAgfQoKCiAgICBjbGFzcyBQcm9ncmFtCiAgICB7CiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIGJhciA9IG5ldyBCYXIoKTsKCiAgICAgICAgICAgIGJhci5DdXN0b21Cb29sLlZhbHVlID0gdHJ1ZTsKCiAgICAgICAgICAgIHZhciBxcXEgPSBiYXIuR2V0VHlwZSgpLkdldFByb3BlcnRpZXMoKTsKCiAgICAgICAgICAgIHZhciBwcm9wcyA9IGJhci5HZXRUeXBlKCkuR2V0UHJvcGVydGllcyhCaW5kaW5nRmxhZ3MuUHVibGljIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlKS5XaGVyZSh4ID0+IHguUHJvcGVydHlUeXBlLklzR2VuZXJpY1R5cGUgJiYgeC5Qcm9wZXJ0eVR5cGUuR2V0R2VuZXJpY1R5cGVEZWZpbml0aW9uKCk9PXR5cGVvZihGb288PikgKTsKICAgICAgICAgICAgZm9yZWFjaCAodmFyIHByb3AgaW4gcHJvcHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgoYm9vbCkocHJvcC5Qcm9wZXJ0eVR5cGUuR2V0TWV0aG9kKCJJc01vZGlmaWVkIikuSW52b2tlKHByb3AuR2V0VmFsdWUoYmFyKSwgbmV3IG9iamVjdFtdIHsgfSkpKQogICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNoYW5nZWQpOwogICAgICAgICAgICBDb25zb2xlLlJlYWRMaW5lKCk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBjbGFzcyBUZXN0Q29udHJvbGxlcgogICAgewogICAgfQp9Cg==