C# 您将如何为该设备建模?

C# 您将如何为该设备建模?,c#,model,C#,Model,我正在为一个产品创建一个内部诊断应用程序,该产品在I2C总线上有一组可单独寻址的设备 一般的想法是,我查询总线上的每个设备,并获得“原始数据”的字节数组。字节数组的长度取决于单个设备 我创建了一个名为“FormattedData”的抽象类,其中有一个名为“RawData”的属性 public abstract class FormattedData { protected byte[] _rawData; public FormattedData(int rawDataLen

我正在为一个产品创建一个内部诊断应用程序,该产品在I2C总线上有一组可单独寻址的设备

一般的想法是,我查询总线上的每个设备,并获得“原始数据”的字节数组。字节数组的长度取决于单个设备

我创建了一个名为“FormattedData”的抽象类,其中有一个名为“RawData”的属性

public abstract class FormattedData {

    protected byte[] _rawData;

    public FormattedData(int rawDataLength) {
        _rawData = new byte[rawDataLength];
    }

    public byte[] RawData {
        get { return _rawData; }
        set {
            if (value.Length != _rawData.Length) {
                throw new ArgumentOutOfRangeException("RawData",
                    "The Raw Data byte array for a " + this.GetType().Name +
                    " must be " + _rawData.Length.ToString() + "-bytes long." +
                    Environment.NewLine +
                    "Length of supplied array: [" + value.Length.ToString() + "]");
            }

            _rawData = value;
        }
    }
}
I2C总线上的每个设备都通过从FormattedData继承获得自己的模型

然后,我可以根据需要操作RawData字节数组中的数据,从而公开设备的一组属性。就我而言,这些数据都是只读的。例如:

public class MyTestDevice : FormattedData {

    public MyTestDevice()
        : base(256) {
    }

    public string VendorName {
        get { return (ASCIIEncoding.ASCII.GetString(_rawData, 20, 16)); }
        set { ;}
    }

    public bool LossOfSignal {
        get { return ((_rawData[110] & 0x02) == 0x02); }
        set { ;}
    }
}
那么,关于我的问题

我正在根据规范为SFP收发器创建一个模型

长话短说,单个物理SFP设备有两个原始数据表AO和A2。每个数据表必须独立查询,最多可返回256字节

问题在于A2表中的两个属性取决于A0表中的值。A2表中的一些模拟值根据A0表中设置的标志进行不同的缩放

对这样一个具有多个“原始数据”字节数组的设备进行建模的最佳方法是什么?一个数组中的值可能依赖于另一个数组中的值

如果可能的话,我想为所有设备维护某种标准接口

创建一个将数据格式化为其成员之一的类。 它应该看起来像MyTestDevice。 扩展该类,使其具有本地设备的2个formattedData成员。 修改VendorName等函数以使用这两个表。
最后,我修改了FormattedData,以便它可以容纳数量可变的RawData字节数组

构造函数获取KeyValuePairs的列表。每个键表示一个RawData数组的描述,每个值表示该数组的长度

然后,我可以使用它的描述对任何RawData数组进行索引

public abstract class FormattedData {

    protected Dictionary<string, byte[]> _rawData = new Dictionary<string, byte[]>();

    public FormattedData(IEnumerable<KeyValuePair<string, int>> rawDataConfigs) {
        rawDataConfigs.ToList()
            .ForEach(kvp => _rawData.Add(kvp.Key, new byte[kvp.Value]));
    }

    public IEnumerable<string> RawDataNames {
        get {
            foreach (var kvp in _rawData) {
                yield return kvp.Key;
            }
        }
    }

    public byte[] this[string rawDataName] {
        get {
            return _rawData[rawDataName];
        }
        set {
            if (value.Length != _rawData[rawDataName].Length) {
                throw new ArgumentOutOfRangeException("RawData",
                    "The Raw Data byte array for a " + this.GetType().Name +
                    " must be " + _rawData[rawDataName].Length.ToString() + "-bytes long." +
                    Environment.NewLine +
                    "Length of supplied array: [" + value.Length.ToString() + "]");
            }

            _rawData[rawDataName] = value;
        }
    }
}
我更新的测试设备看起来像两个RawData数组——一个称为“A0”,另一个称为“A2”:

public class MyTestDevice: FormattedData {

    const string A0 = "A0";
    const string A2 = "A2";
    const int _rawDataLength_A0 = 256;
    const int _rawDataLength_A2 = 256;

    static readonly Dictionary<string, int> _rawDataConfigs =
        new Dictionary<string, int> {
            {A0, _rawDataLength_A0},
            {A2, _rawDataLength_A2}    
        };

    public MyTestDevice()
        : base(_rawDataConfigs) {
    }

    public string VendorName {
        get { return (ASCIIEncoding.ASCII.GetString(_rawData[A0], 20, 16)); }
        set { ;}
    }

     public bool LossOfSignal {
        get { return ((_rawData[A0][110] & 0x02) == 0x02); }
        set { ;}

    }
}
我认为我应该能够使用这种方法对几乎任何I2C设备进行建模——任何具有多个页面(如EEPROM或XFP)或多个原始数据表(如SFP)的设备都应该适合


评论或批评?

能够对每个设备一视同仁有一些好处,例如:var cast=FormattedDataMyTestDevice;cast.RawData=。。。。更具体地说,我希望有一个列表——当其中一个设备偏离标准的“FormattedData”模式时,我将如何做到这一点?