C#中泛型方法使用

时间:2022-11-08 10:14:10

泛型允许灵活地创建类型,处理一种或多种特定类型的对象,这些类型是在实例化时确定的,不能假定该泛型对象提供了什么类型。

这里通过一实例,来例举泛型带来的好处。

项目遇到一个中英文互相翻译的情况,但由于是接口调用的关系,后台返回的结果定义的是枚举,并且枚举的种类和数量很多。例如角色枚举,运行模式枚举,用户权限枚举,用户启用枚举等等,举例:

    /// <summary>
/// 用户启用枚举
/// </summary>
[Serializable]
[DataContract]
public enum UserEnable
{
[EnumMember] 用户启用 = 0,
[EnumMember] 用户禁用 = 1,
}
那么对应的就是英文的枚举:
    /// <summary>
/// 用户启用枚举
/// </summary>
[Serializable]
[DataContract]
public enum UserEnable
{
[EnumMember] User_Disable = 0,
[EnumMember] User_Enabled = 1,
}
最开始的解决方式是采用switch,每一个中文枚举过来,就用case对应其中的英文字符串返回,简单直观。形如:

    public static string UserEnableToEnglish(UserEnable para)
{
string result;
switch(para){
case UserEnable.启用:
result = "Enale";break;
case UserEnable.禁用:
result = "Disale";break;
}
return result;
}
这样每个枚举都要写一个这样的方法,代码将非常臃肿。既然都是枚举的转换,参照多态的思想,类似的代码逻辑肯定可以简化。于是,有了下面的泛型方法处理方式
    /// <summary>
/// 中文转换成英文的公共方法
/// </summary>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <param name="result"></param>
/// <param name="EnglishStr"></param>
public static string ConvertChineseToEnglish<T1, T2>(string result)
{
string englishStr = "The_result_does_not_exist";
string[] array = Enum.GetNames(typeof(T1));
int i = 0;
while (i < array.Length)
{
if (array[i] == result)
{
string[] engStr = Enum.GetNames(typeof(T2));
englishStr = engStr[i];
break;
}
i++;
}
return englishStr.Replace("_"," ");
}


最后调用方式就变成了:
String result = "用户禁用";
string value = ConvertChineseToEnglish<UserResult, UserResult_English>(result);
最后,这一个泛型方法,在项目中至少节省了两三百行代码。