using System;
using static System.Console ;
using System.Reflection ;
public class Program {
public static void Main( ) {
var teste = new Teste( ) ;
teste.ListProperties ( ) ;
WriteLine( teste.GetPropValue < int> ( "y" ) ) ;
var teste2 = new Teste2( ) ;
teste2.ListFields ( ) ;
}
}
public class Teste {
public int x { get; set; } = 10 ;
public int y { get; set; } = 10 ;
}
public class Teste2 {
public int x = 10 ;
public int y = 10 ;
}
public static class ObjectExt {
public static void ListProperties( this object obj) {
foreach( var prop in obj.GetType ( ) .GetProperties ( ) ) {
WriteLine( $"{prop.Name} = {prop.GetValue(obj, null)}" ) ;
}
}
public static void ListFields( this object obj) {
foreach( var field in obj.GetType ( ) .GetFields ( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ) ) {
WriteLine( $"{field.Name} = {field.GetValue(obj)}" ) ;
}
}
public static T GetPropValue< T> ( this object value, string propertyName) {
if ( value == null ) { throw new ArgumentNullException( "value" ) ; }
if ( String.IsNullOrEmpty ( propertyName) ) { throw new ArgumentException( "propertyName" ) ; }
PropertyInfo info = value.GetType ( ) .GetProperty ( propertyName) ;
return ( T) info.GetValue ( value, null ) ;
}
public static FieldInfo GetFieldInfo( this Type objType, string fieldName, BindingFlags flags, bool isFirstTypeChecked = true ) {
FieldInfo fieldInfo = objType.GetField ( fieldName, flags) ;
if ( fieldInfo == null && objType.BaseType != null ) fieldInfo = objType.BaseType .GetFieldInfo ( fieldName, flags, false ) ;
if ( fieldInfo == null && isFirstTypeChecked) throw new MissingFieldException( String.Format ( "Field {0}.{1} could not be found with the following BindingFlags: {2}" , objType.ReflectedType .FullName , fieldName, flags.ToString ( ) ) ) ;
return fieldInfo;
}
}
//https://pt.stackoverflow.com/q/105236/101
dXNpbmcgU3lzdGVtOwp1c2luZyBzdGF0aWMgU3lzdGVtLkNvbnNvbGU7CnVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwoKcHVibGljIGNsYXNzIFByb2dyYW0gewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKSB7CgkJdmFyIHRlc3RlID0gbmV3IFRlc3RlKCk7CgkJdGVzdGUuTGlzdFByb3BlcnRpZXMoKTsKCQlXcml0ZUxpbmUodGVzdGUuR2V0UHJvcFZhbHVlPGludD4oInkiKSk7CgkJdmFyIHRlc3RlMiA9IG5ldyBUZXN0ZTIoKTsKCQl0ZXN0ZTIuTGlzdEZpZWxkcygpOwoJfQp9CgpwdWJsaWMgY2xhc3MgVGVzdGUgewogICAgcHVibGljIGludCB4IHsgZ2V0OyBzZXQ7IH0gPSAxMDsKICAgIHB1YmxpYyBpbnQgeSB7IGdldDsgc2V0OyB9ID0gMTA7Cn0KCnB1YmxpYyBjbGFzcyBUZXN0ZTIgewogICAgcHVibGljIGludCB4ID0gMTA7CiAgICBwdWJsaWMgaW50IHkgPSAxMDsKfQoKcHVibGljIHN0YXRpYyBjbGFzcyBPYmplY3RFeHQgewogICAgcHVibGljIHN0YXRpYyB2b2lkIExpc3RQcm9wZXJ0aWVzKHRoaXMgb2JqZWN0IG9iaikgewoJCWZvcmVhY2godmFyIHByb3AgaW4gb2JqLkdldFR5cGUoKS5HZXRQcm9wZXJ0aWVzKCkpIHsKCQkJV3JpdGVMaW5lKCQie3Byb3AuTmFtZX0gPSB7cHJvcC5HZXRWYWx1ZShvYmosIG51bGwpfSIpOwoJCX0KCX0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBMaXN0RmllbGRzKHRoaXMgb2JqZWN0IG9iaikgewoJCWZvcmVhY2godmFyIGZpZWxkIGluIG9iai5HZXRUeXBlKCkuR2V0RmllbGRzKEJpbmRpbmdGbGFncy5QdWJsaWMgfCBCaW5kaW5nRmxhZ3MuTm9uUHVibGljIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlKSkgewoJCQlXcml0ZUxpbmUoJCJ7ZmllbGQuTmFtZX0gPSB7ZmllbGQuR2V0VmFsdWUob2JqKX0iKTsKCQl9Cgl9CiAgICBwdWJsaWMgc3RhdGljIFQgR2V0UHJvcFZhbHVlPFQ+KHRoaXMgb2JqZWN0IHZhbHVlLCBzdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidmFsdWUiKTsgfQogICAgICAgIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShwcm9wZXJ0eU5hbWUpKSB7IHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigicHJvcGVydHlOYW1lIik7IH0KICAgICAgICBQcm9wZXJ0eUluZm8gaW5mbyA9IHZhbHVlLkdldFR5cGUoKS5HZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogICAgICAgIHJldHVybiAoVClpbmZvLkdldFZhbHVlKHZhbHVlLCBudWxsKTsKICAgIH0KCXB1YmxpYyBzdGF0aWMgRmllbGRJbmZvIEdldEZpZWxkSW5mbyh0aGlzIFR5cGUgb2JqVHlwZSwgc3RyaW5nIGZpZWxkTmFtZSwgQmluZGluZ0ZsYWdzIGZsYWdzLCBib29sIGlzRmlyc3RUeXBlQ2hlY2tlZCA9IHRydWUpIHsKCQlGaWVsZEluZm8gZmllbGRJbmZvID0gb2JqVHlwZS5HZXRGaWVsZChmaWVsZE5hbWUsIGZsYWdzKTsKCQlpZiAoZmllbGRJbmZvID09IG51bGwgJiYgb2JqVHlwZS5CYXNlVHlwZSAhPSBudWxsKSBmaWVsZEluZm8gPSBvYmpUeXBlLkJhc2VUeXBlLkdldEZpZWxkSW5mbyhmaWVsZE5hbWUsIGZsYWdzLCBmYWxzZSk7CgkKCQlpZiAoZmllbGRJbmZvID09IG51bGwgJiYgaXNGaXJzdFR5cGVDaGVja2VkKSB0aHJvdyBuZXcgTWlzc2luZ0ZpZWxkRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIkZpZWxkIHswfS57MX0gY291bGQgbm90IGJlIGZvdW5kIHdpdGggdGhlIGZvbGxvd2luZyBCaW5kaW5nRmxhZ3M6IHsyfSIsIG9ialR5cGUuUmVmbGVjdGVkVHlwZS5GdWxsTmFtZSwgZmllbGROYW1lLCBmbGFncy5Ub1N0cmluZygpKSk7CgkJcmV0dXJuIGZpZWxkSW5mbzsKCX0KfQoKLy9odHRwczovL3B0LnN0YWNrb3ZlcmZsb3cuY29tL3EvMTA1MjM2LzEwMQ==