Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从动力学词典中包含的元素中获取属性的更快方法?_C#_Dictionary_Dynamic_Data Structures - Fatal编程技术网

C# 从动力学词典中包含的元素中获取属性的更快方法?

C# 从动力学词典中包含的元素中获取属性的更快方法?,c#,dictionary,dynamic,data-structures,C#,Dictionary,Dynamic,Data Structures,现在我有一个名为IMessageConfiguration的接口,它实现了一个名为Label(类型为byte)的属性。我有一个标签映射到以下结构中的相对消息配置: Dictionary configurationMap=new Dictionary() 现在,尽管字典是动态的,但我只是用IMessageConfiguration或IMessageConfiguration来填充它。无论每个字典条目的类型是什么,条目都将具有属性Label,因为所有条目最终都将具有IMessageConfigura

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

Dictionary configurationMap=new Dictionary()

现在,尽管字典是动态的,但我只是用
IMessageConfiguration
IMessageConfiguration
来填充它。无论每个字典条目的类型是什么,条目都将具有属性
Label
,因为所有条目最终都将具有
IMessageConfiguration
基本类型。不过,我知道编译器对此一无所知

我正在编写一个例程来浏览字典,并获取每个
IMessageConfiguration
条目的
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;
}

我认为你应该尽可能避免动态的。在您的情况下,您可以将所有非
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);
}
公共接口IMessageConfiguration
{
字符串说明{get;}
字节标签{get;}
ushort LSB{get;}
ushort MSB{get;}
双分辨率{get;}
int符号位{get;}
字符串标题{get;}
字符串单位{get;}
}
公共接口IMessageConfiguration:IMessageConfiguration{
uint编码(T数据);
T解码(uint消息);
}

并使用
字典
。即使您出于某种原因坚持使用
dynamic
,您也可以执行
yourDict.OfType()。选择(c=>c.Label).ToList()
来获取这些标签

提供
IMessageConfiguration
接口的完整定义可能有助于回答这个问题。@Evk我想我可以这样做,但它实际上只是一个容器类型类,有一堆伪数据属性。我的观点是-if
Label
属性与类型
T
(例如,如果
标签
始终是
字符串
)-您可以将其移动到父界面
IMessageConfiguration
,然后进行
Dictionary@Evk是的,很好。让我提供接口定义,并且“是”标签始终是字节。@Evk已更新,以包含
IMessageConfiguration
的接口定义。是否将这两种接口类型放在同一个(.cs)中文件在您的项目中?@Evk我不明白为什么,它们是密切相关的,并且接口的命名没有区别,对我来说,在这种形式下,它们属于together@Snoopy嗯,我也这么认为,我的意思是有些人会对此提出异议,但这并没有被广泛接受。@Evk不过,有些人会提出什么建议作为候补人选?@Snoopy you can's请参阅此问题中的一些选项(包括Microsoft自己声称使用的选项):
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);
}