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我想我可以这样做,但它实际上只是一个容器类型类,有一堆伪数据属性。我的观点是-ifLabel
属性与类型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);
}