using System.Runtime.InteropServices;
public interface IValueField
ulong Value { get; set; }
public interface IFlagField
public class ValueField : IValueField
public ulong Value { get { return _Value; } set { _Value = value; } }
public class FlagField : IFlagField
public bool Value { get { return _Flag; } set { _Flag = value; } }
public partial class Peripheral
AddressReg = new AddressRegister();
ControlReg = new ControlRegister();
IManagerFields lbaManagerFields = new ManagerData(ControlReg.Enabled, ControlReg.ReadMode, AddressReg.Address);
lbaManager = new Manager(lbaManagerFields);
public void RegCallback()
lbaManager.DoSomething();
private class AddressRegister
Address = new ValueField();
public IValueField Address;
private class ControlRegister
Enabled = new FlagField();
ReadMode = new FlagField();
public IFlagField Enabled;
public IFlagField ReadMode;
public interface IManagerFields
IFlagField Enabled { get; }
IFlagField ReadMode { get; }
IValueField Address { get; }
private record ManagerData(IFlagField Enabled, IFlagField ReadMode, IValueField Address) : IManagerFields;
private AddressRegister AddressReg;
private ControlRegister ControlReg;
private Manager lbaManager;
public partial class Peripheral
public Manager(IManagerFields regs)
public void DoSomething()
Console.WriteLine(Regs.Enabled.Value);
Console.WriteLine(Regs.Address.Value);
Console.WriteLine(Regs.ReadMode.Value);
Regs.ReadMode.Value = true;
Console.WriteLine(Regs.Enabled.Value);
Console.WriteLine(Regs.Address.Value);
Console.WriteLine(Regs.ReadMode.Value);
private IManagerFields Regs;
public static void Main()
Peripheral per = new Peripheral();