C++中enum与字符串或CString互相转换的方法

        C++中没有专门为enum与字符串或CString互相转换的直接方法,但是工作中会常遇到相互转换的场景。下面介绍一种自己实现的方法,首先得定义一个enum类型,同时,定义一个与之对应的字符串类型,然后,可以相互转换了。

enum E_ANIMAL {
    E_ANIMAL_EAGLE = 0,
	E_ANIMAL_MAGPIE,
	E_ANIMAL_PIG,
	E_ANIMAL_CARP,
	E_ANIMAL_END
};

const CString ANIMAL[] = {
    "E_ANIMAL_EAGLE",
	"E_ANIMAL_MAGPIE",	
	"E_ANIMAL_PIG",
	"E_ANIMAL_CARP",
    "E_ANIMAL_END"
};

bool fnConverCStringToEnum(const CString csParam,E_ANIMAL &eName)
{
	CString csAnimalName;
	int iCount = 0;

	eName = E_ANIMAL_END;
	csAnimalName = csParam;
	iCount = sizeof(ANIMAL) / sizeof(ANIMAL[0]);
	for(int i=0;i<iCount;i++)
	{
	    if(0 == csAnimalName.CompareNoCase(ANIMAL[i]))
		{
			eName = E_ANIMAL(i);
			break;
		}
		else
		{
			continue;
		}
		if(E_ANIMAL_END == eName)
		{
			return false;
		}
	}
	cout << "eName is: " << eName << endl;

	return true;
}

bool fnConverEnumToCString(const E_ANIMAL eParam,CString &csName)
{
	E_ANIMAL eTemp = E_ANIMAL_END;
	int idx = 0;

	if(eParam > E_ANIMAL_END)
	{
		return false;
	}
	eTemp = eParam;
	idx = static_cast<enum>(eTemp);
	csName = ANIMAL[idx];
	cout << "csName is: " << csName.GetBuffer(0) << endl;
	return true;
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}
	else
	{
		// TODO: code your application's behavior here.
		CString csAnimalName;
		E_ANIMAL eAnimalName;
        if(!fnConverEnumToCString(E_ANIMAL_CARP,csAnimalName))
		{
			return false;
		}
		if(!fnConverCStringToEnum("E_ANIMAL_CARP",eAnimalName))
		{
			return false;
		}
		cout << "csAnimalName is: " << csAnimalName.GetBuffer(0) << endl;
		cout << "eAnimalName is: " << eAnimalName << endl;
	}

	return nRetCode;
}


在C#,可以使用枚举类型来定义一组具有固定值的常量。针对枚举类型数字与字符串的对换,可以使用以下两种方法: 1. 使用Enum.Parse()和Enum.ToString()方法 这种方法可以将枚举类型的数字转换字符串,或将字符串转换为枚举类型的数字。示例代码如下: ```csharp enum Colors { Red = 1, Green = 2, Blue = 3 } // 将数字转换字符串 int colorNumber = 2; string colorString = Enum.GetName(typeof(Colors), colorNumber); // "Green" // 将字符串转换为数字 string colorString = "Blue"; Colors colorNumber = (Colors)Enum.Parse(typeof(Colors), colorString); // Colors.Blue ``` 2. 使用Description属性和反射机制 这种方法需要使用System.ComponentModel命名空间的Description特性,以及反射机制获取枚举类型的Description属性值。示例代码如下: ```csharp using System.ComponentModel; using System.Reflection; enum Colors { [Description("红色")] Red = 1, [Description("绿色")] Green = 2, [Description("蓝色")] Blue = 3 } // 将数字转换字符串 int colorNumber = 2; Colors color = (Colors)colorNumber; string colorString = color.GetType() .GetMember(color.ToString()) .FirstOrDefault() ?.GetCustomAttribute<DescriptionAttribute>() ?.Description; // "绿色" // 将字符串转换为数字 string colorString = "蓝色"; Colors colorNumber = Enum.GetValues(typeof(Colors)) .Cast<Colors>() .FirstOrDefault(c => c.GetType() .GetMember(c.ToString()) .FirstOrDefault() ?.GetCustomAttribute<DescriptionAttribute>() ?.Description == colorString); // Colors.Blue ``` 注意:第二种方法需要在枚举类型为每个常量定义Description特性,并且Description特性的值应与对应的字符串相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值