public virtual string[,] GetRegistersValues()
{
var result = new Dictionary<string, ulong>();
var properties = GetType().GetProperties();
//uint may be marked with [Register]
var registerInfos = properties.Where(x => x.CanRead && x.GetCustomAttributes(false).Any(y => y is RegisterAttribute));
foreach(var registerInfo in registerInfos)
{
result.Add(registerInfo.Name, (ulong)((dynamic)registerInfo.GetGetMethod().Invoke(this, null)));
}
//every field that is IRegister, contains properties interpreted as registers.
var compoundRegisters = properties.Where(x => typeof(IRegisters).IsAssignableFrom(x.PropertyType));
foreach(var register in compoundRegisters)
{
var compoundRegister = (IRegisters)register.GetGetMethod().Invoke(this, null);
foreach(var key in compoundRegister.Keys)
{
result.Add("{0}{1}".FormatWith(register.Name, key), (ulong)(((dynamic)compoundRegister)[key]));
}
}
var table = new Table().AddRow("Name", "Value");
table.AddRows(result, x => x.Key, x => "0x{0:X}".FormatWith(x.Value));
return table.ToArray();
}