using KGySoft.CoreLibraries;
using KGySoft.Reflection;
using KGySoft.Diagnostics;
public static void Main()
var type = typeof(TestClass);
var simpleProperties = type.GetTypeInfo().DeclaredProperties
.Where(p => p.CanRead && p.CanWrite && !p.GetMethod.IsStatic && p.GetMethod.GetParameters().Length == 0);
var accessors = simpleProperties.Select(pi => PropertyAccessor.GetAccessor(pi)).ToArray();
var members = TypeAccessor.Create(type).GetMembers().Where(m => simpleProperties.Any(p => p.Name == m.Name)).ToArray();
var testInstance = ThreadSafeRandom.Instance.NextObject<TestClass>();
DumpKGySoft(accessors, testInstance);
DumpFastMember(ObjectAccessor.Create(testInstance), members);
var cachedObjectAccessor = ObjectAccessor.Create(testInstance);
var cachedPropertyInfo = typeof(TestClass).GetProperty(nameof(TestClass.IntProp));
var cachedPropertyAccessor = PropertyAccessor.GetAccessor(cachedPropertyInfo);
new PerformanceTest<object>
.AddCase(() => cachedPropertyInfo.GetValue(testInstance), "System.Reflection")
.AddCase(() => cachedObjectAccessor["IntProp"], "FastMember")
.AddCase(() => cachedPropertyAccessor.GetInstanceValue<TestClass, int>(testInstance), "KGySoft, generic access")
.AddCase(() => cachedPropertyAccessor.Get(testInstance), "KGySoft, non-generic access")
.DumpResults(Console.Out);
private static void DumpKGySoft(PropertyAccessor[] accessors, object instance)
foreach (PropertyAccessor accessor in accessors)
Console.WriteLine($"{accessor.MemberInfo.Name}: {accessor.Get(instance)}");
private static void DumpFastMember(ObjectAccessor accessor, Member[] members)
foreach (Member member in members)
Console.WriteLine($"{member.Name}: {accessor[member.Name]}");
public string StringProp { get; set; }
public int IntProp { get; set; }
public int this[int index] { get => index; set {} }