using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Linq;
namespace APT.Infrastructure.Core
{
///
/// 类型扩展方法类
///
public static class EnumExtensions
{
///
/// 获取枚举值值
///
/// 枚举值
///
public static String GetDescription(this Enum enumeration)
{
if (enumeration == null)
return String.Empty;
var enumType = enumeration.GetType();
var fi = enumType.GetField(Enum.GetName(enumType, enumeration));
var descAttr = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute));
return descAttr == null || String.IsNullOrEmpty(descAttr.Description) ? enumeration.ToString() : descAttr.Description;
}
///
/// 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值。
///
/// 要将 value 转换为的枚举类型。
/// 要转换的枚举名称或基础值的字符串表示形式。
/// 默认值
/// 如果 value 参数成功转换,则返回类型为 TEnum 的一个对象,其值由 value 表示;否则为 defaultValue。
public static TEnum ToEnum(this String value, TEnum defaultValue) where TEnum : struct
{
if (String.IsNullOrEmpty(value))
return defaultValue;
TEnum result;
bool parseResult = Enum.TryParse(value, out result);
return parseResult ? result : defaultValue;
}
}
public class CommonEqualityComparer : IEqualityComparer
{
private Func keySelector;
public CommonEqualityComparer(Func keySelector)
{
this.keySelector = keySelector;
}
public bool Equals(T x, T y)
{
return EqualityComparer.Default.Equals(keySelector(x), keySelector(y));
}
public int GetHashCode(T obj)
{
return EqualityComparer.Default.GetHashCode(keySelector(obj));
}
}
public static class DistinctExtensions
{
public static IEnumerable Distinct(this IEnumerable source, Func keySelector)
{
return source.Distinct(new CommonEqualityComparer(keySelector));
}
}
}