现在,我有一个名为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()
来获取这些标签。