现在,我有一个名为IMessageConfiguration<T>的接口,该接口实现了名为Label(类型为byte)的属性。我有以下结构的标签映射到它们的相对消息配置:

Dictionary<byte, dynamic> configurationMap = new Dictionary<byte, dynamic>();

现在,尽管字典是动态的,但我只用IMessageConfiguration<double>IMessageConfiguration<uint>填充它。不管每个字典条目是哪种类型,该条目都将具有属性Label,因为所有条目最终都将具有IMessageConfiguration<T>基本类型。但是,我确实理解编译器对此一无所知。

我正在编写一个例程来遍历字典并为每个Label条目获取IMessageConfiguration<T>属性。这是我目前的尝试:

public IList<byte> GetLabels()
{
    IList<byte> labels = new List<byte>();

    // obtain all of the labels
    foreach (var configuration in this.configurationMap)
    {
        if (configuration.Value is IMessageConfiguration<double>)
        {
            labels.Add((configuration.Value as IMessageConfiguration<double>).Label);
        }
        else if (configuration.Value is IMessageConfiguration<uint>)
        {
            labels.Add((configuration.Value as IMessageConfiguration<uint>).Label);
        }
    }

    return labels;
}


有没有一种方法可以更清晰地获取每种消息配置的所有Label属性?

如注释中所要求的,这是IMessageConfiguration<T>接口的完整定义。

public interface IMessageConfiguration<T>
{
    string Description { get; }
    byte Label { get; }
    ushort LSB { get; }
    ushort MSB { get; }
    double Resolution { get; }
    int SignBit { get; }
    string Title { get; }
    string Units { get; }
    uint Encode(T data);
    T Decode(uint message);
}

最佳答案

我说你应该尽可能避免使用dynamic。您可以将所有与T不相关的所有属性放到父接口中:

public interface IMessageConfiguration
{
    string Description { get; }
    byte Label { get; }
    ushort LSB { get; }
    ushort MSB { get; }
    double Resolution { get; }
    int SignBit { get; }
    string Title { get; }
    string Units { get; }
}

public interface IMessageConfiguration<T> : IMessageConfiguration {
    uint Encode(T data);
    T Decode(uint message);
}


并改用Dictionary<byte, IMessageConfiguration>。即使出于某些原因坚持使用dynamic-也可以执行yourDict.OfType<IMessageConfiguration>().Select(c => c.Label).ToList()来获取这些标签。

08-06 02:48