2017-10-09 36 views
2

现在我有一个名为IMessageConfiguration<T>的接口,它实现了一个名为Label(类型为byte)的属性。我有地图上的标签,以它们的相对配置消息中的结构如下:从动态词典中包含的元素获取属性的更快方法?

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

现在,虽然字典是动态我只用任一IMessageConfiguration<double>IMessageConfiguration<uint>或填充它。无论每个字典条目的类型如何,该条目将具有属性Label,因为所有条目最终都将具有IMessageConfiguration<T>基本类型。 但我知道编译器对此不了解。

我正在编写一个例程来查看字典并获得IMessageConfiguration<T>条目中的每个条目的Label属性。这是我在做这个当前的尝试:

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); 
} 
+0

提供'IMessageConfiguration '接口的完整定义可能有助于回答。 – Evk

+0

@Evk我想我可以做到这一点,但它实际上只是一个容器类型的类,有一堆虚拟数据属性。 – Snoopy

+1

我的观点是,如果'Label'属性与'T'类型无关(例如如果'Label'总是'string') - 您可以将其移动到父接口“IMessageConfiguration”,然后使用'Dictionary Evk

回答

1

我想说,你应该尽量避免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()来获得这些标签。

+0

您是否会将这两种接口类型放入项目中的相同(.cs)文件中? – Snoopy

+0

@Snoopy我会的,但这通常不是一个好习惯。 – Evk

+0

@Evk我不明白为什么,他们是密切相关的,并且没有界面的命名差异,对于我来说,在这种形式下,他们属于一起 – Icepickle