2017-10-09 38 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