- Enum类型没有实现IEquatable接口,Dictionary中无法添加Enum类型的元素。
通过实现Enum的IEquatable接口,便可以将enum类型作为key 添加到dictionary中
代码示例与应用
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace testExample
{
//实现IEqualityComparer接口
public class EnumComparer<T> : IEqualityComparer<T> where T : struct
{
public bool Equals(T first, T second)
{
var firstPara = Expression.Parameter(typeof(T), "first");
var secondPara = Expression.Parameter(typeof(T), "second");
var equalExpression = Expression.Equal(firstPara, secondPara);
return Expression.Lambda<Func<T, T, bool>>(equalExpression, new[] { firstPara, secondPara }).Compile().Invoke(first, second);
}
public int GetHashCode(T instance)
{
var parameter = Expression.Parameter(typeof(T), "instance");
var convertExpression = Expression.Convert(parameter, typeof(int));
return Expression.Lambda<Func<T, int>>(convertExpression, new[] { parameter }).Compile().Invoke(instance);
}
}
public enum EAlarmType : uint
{
Null = 0,
Common = 1,
Warn = 2,
Serious = 3,
}
public enum MsgDetails : uint
{
Null = 0,
PLC_Error = 1,
GPIO_Error = 2,
PC_PowerOff = 3,
Reader_Error = 4
}
class Program
{
static void Main(string[] args)
{
var dicT = new Dictionary<MsgDetails, EAlarmType>(new EnumComparer<MsgDetails>());
dicT.Add(MsgDetails.GPIO_Error, EAlarmType.Common);
dicT.Add(MsgDetails.PC_PowerOff, EAlarmType.Serious);
dicT.Add(MsgDetails.PLC_Error, EAlarmType.Common);
foreach (KeyValuePair<MsgDetails,EAlarmType> pair in dicT)
{
Console.WriteLine("key:{0}--value:{1}", pair.Key, pair.Value);
}
Console.ReadLine();
}
}
}
输出:
key:GPIO_Error–value:Common
key:PC_PowerOff–value:Serious
key:PLC_Error–value:Common