[c#]通过一个枚举值获取另一个枚举值———通过国家全称获取国家简称

概述:两个枚举间可通过int值进行关联,从而实现通过一个枚举值获取另一枚举值,而达到本案例中通过国家全称获取国家简称,反之亦然。

实现:直接看代码:

先定义两个枚举

    public enum Country
    {

        US,
        CA,
        IN,
        IT,
        MX,
        NL,
        JP,
        DE,
        AU,
        UK,
        CN,
        ES,
        BR,
        FR
    }
    //此处枚举值忽略空格和大写
    //不知道枚举中如何包含空格,用了[united states]也不行 好像是不能出现空格,()-/等字符
    public enum CountryFull
    {
        unitedstates,
        canada,
        india,
        italy,
        mexico,
        netherlands,
        japan,
        germany,
        australia,
        unitedkingdom,
        china,
        spain,
        brazil,
        france
    }

 1.通过国家全称获取国家简称的方式:

        /// <summary>
        /// 通过国家的全称获取国家简称
        /// </summary>
        /// <param name="countryName">国家全称(全小写,无空格)</param>
        /// <returns></returns>
        public string GetCountry(string countryName)
        {
            //先字符串转Enum类型
            CountryFull countryAll = (CountryFull)Enum.Parse(typeof(CountryFull), countryName);
            //获取数值
            int intValue = (int)countryAll;
            //通过数值转Enum类型
            Country country = (Country)Enum.ToObject(typeof(Country), intValue);
            return country.ToString();
        }

2.通过国家简称获取国家全称的方式:

        /// <summary>
        /// 通过国家简称获取国家全称
        /// </summary>
        /// <param name="countryName">国家简称(全大写)</param>
        /// <returns></returns>
        public string GetCountryFull(string countryName)
        {
            //先字符串转Enum类型
            Country country = (Country)Enum.Parse(typeof(Country), countryName);
            //获取数值
            int intValue = (int)country;
            //通过数值转Enum类型
            CountryFull countryAll = (CountryFull)Enum.ToObject(typeof(CountryFull), intValue);
            return countryAll.ToString();
        }

备注:此种方式要确保枚举一和枚举二的对应关系要一一对应即数据的顺序不能变化,否则就会出现错乱得情况而偏离预期,因为此方式最重要得一点就是:两个枚举间的对应关联是通过枚举的int值相同来保证两枚举间的正确对应关联,看下图应该更能理解一点

拓展:除了这种方式,要达到本案例中的效果,还可以用枚举中自带的Attribute来实现,这种方式可以简单明了的知道这个枚举(一)对应的描述即可以快速得出国家简称对应国家全称,反之亦然,而且最重要得一点是,这里可以写空格,嘻嘻

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp4
{
    public class EnumTest
    {
        /// <summary>
        /// 通过国家简称获取国家描述(枚举值获取枚举描述)
        /// </summary>
        /// <param name="countryName"></param>
        /// <returns></returns>
        internal object GetCountryOneFull(string countryName)
        {
            var country = (CountryOne)Enum.Parse(typeof(CountryOne), countryName);
            var countryFull = (country.GetType().GetField(countryName).GetCustomAttributes(false)[0] as DescriptionAttribute).Description;
            return countryFull;
        }
        /// <summary>
        /// 通过国家全称获取国家简称(通过枚举描述获取枚举值)
        /// </summary>
        /// <param name="countryName"></param>
        /// <returns></returns>
        public string GetCountryOne(string countryName)
        {
            var fileds = typeof(CountryOne).GetFields();
            //"CountryOne".Equals(x.FieldType.Name)   筛选类型为CountryOne的枚举值
            //countryName.Equals((x?.GetCustomAttributes(false)[0] as DescriptionAttribute).Description)   筛选描述为countryName的枚举值
            var filed = fileds.FirstOrDefault(x => "CountryOne".Equals(x.FieldType.Name) && countryName.Equals((x?.GetCustomAttributes(false)[0] as DescriptionAttribute).Description));
            return filed.Name;
        }
    }

    public enum CountryOne
    {
        [Description("United State")]
        US,
        [Description("Canada")]
        CA,
        [Description("India")]
        IN,
    }
}

完,编辑于2019-08-10

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页