朋友们,我正在构建一个简单的foreach循环,它从DataTable(tblCORR)获取信息,并用它创建3个其他DT(tblCEMVALVE,tblLOG,tblNUMBER)。需要注意的是,它必须根据tblCORR中提供的内容使用不同的列类型,但当然typeof不允许使用row.ItemArray [2]作为类型。
tblCORR看起来像这样:
LAS.V342.B.REM.ST V342_REM bool tblLOG tblVALVE
CEM.CV44.B.REM.ST CV44_REM bool tblCEMVALVE tblVALVE
CEM.FRT01.PTO06.ST FR_PTO06 bool tblLOG tblSTATUS
CEM.GB02.GEAR.CTR RR_GEAR_SEL byte tblLOG tblSTATUS
CEM.PT21.I_PRES.PSI PT21_PRESS Short tblNUMBER tblDATA
RCP.ADD1.NAME.TXT LAS_ADD1 string tblNUMBER tblLAS
有没有办法在不必在每种情况下放置一堆IF?
提前致谢!
foreach (DataRow row in tblCORR.Rows)
{
switch (row.ItemArray[3].ToString())
{
case "tblCEMVALVE":
{
tblCEMVALVE.Columns.Add(row.ItemArray[1].ToString(), typeof(row.ItemArray[2]));
break;
}
case "tblLOG":
{
tblLOG.Columns.Add(row.ItemArray[1].ToString(), typeof(row.ItemArray[2]));
break;
}
case "tblNUMBER":
{
tblNUMBER.Columns.Add(row.ItemArray[1].ToString(), typeof(row.ItemArray[2]));
break;
}
}
}
答案 0 :(得分:0)
使用该类型名称(它们不是System
命名空间中的类/结构的名称),一种可能的解决方案是使用Dictionary
。例如(用于说明目的的详细代码):
Dictionary<object, Type> knownTypes = new Dictionary<object, Type>();
knownTypes.Add("bool", typeof(bool));
knownTypes.Add("byte", typeof(byte));
knownTypes.Add("Short", typeof(short));
knownTypes.Add("string", typeof(string));
用作:
tblLOG.Columns.Add(row.ItemArray[1].ToString(), knownTypes[row.ItemArray[2]]);
您可能/应该考虑的一些更改:
static
和private
班级成员。row.ItemArray[2].ToString()
)。StringComparer.InvariantCultureIgnoreCase
(如果string
),short
和Short
将是等效的。tblLOG
,tblNUMBER
和tblCEMVALVE
)或直接使用TableName
DataSet
内的{{1}}进行搜索。