在一个方法类中有大量if语句判断,有没有大佬帮忙看看,怎么用枚举的方式进行优化
public LocateDataSourceEventHandler SourceList(string requestId,string reportName)
{
if (reportName.Contains(“WB_SB”)) // 申报单
{
return new WBReport(requestId).WB_SBDataSource;
}
if (reportName.Contains(“WB_ZTY”) || reportName.Contains(“WB_FTY”)) // 货物托运单
{
return new WBReport(requestId).WB_TYDataSource;
}
if (reportName.Contains(“WB_DT”) || reportName.Contains(“WB_BDT”)) // 唛头
{
return new WBReport(requestId).WB_MTDataSource;
}
if (reportName.Contains(“WB_BH_ADD”)) //附页清单
{
return new WBReport(requestId).WB_BH_ADDDataSource;
}
if (reportName.Contains(“WB_HAL”)) //舱单
{
return new WBReport(requestId).WB_HALDataSource;
}
if (reportName.Contains(“WB_BH”)) //保函
{
return new WBReport(requestId).WB_BHDataSource;
}
if (reportName.Contains(“WB_WTS”)) //保函
{
return new WBReport(requestId).WB_WTSDataSource;
}
if (reportName.Contains(“WB_NTWTS”)) //保函
{
return new WBReport(requestId).WB_NTWTSDataSource;
}
if (reportName.Contains(“GHS_DG”)) // GHS
{
return new GHSReport(requestId).GhsDataSource;
}
if (reportName.Contains(“GHS_SH”)) // GHS
{
return new GHSReport(requestId).Ghs_SHDataSource;
}
if (reportName.Contains(“GHS_MT”)) // GHS
{
return new GHSReport(requestId).Ghs_MTDataSource;
}
if (reportName.Contains(“TCP_HWSQ”)) // 通关单
{
return new TCPReport(requestId).TCP_HWSQDataSource;
}
if (reportName.Contains(“TCP_FJ”)) // 通关单
{
return new TCPReport(requestId).TCP_FJDataSource;
}
}
以上是之前未解决的大量if判断,想着找到了方法解决
首先创建两个我们当前需要判断的两个枚举,一个是我们类名的枚举,一个是所有类名中方法的枚举
当然在我们创建类名,和创建类中方法的是否,两者之间的名称是有一定关联的
一下是我项目中所定义的方法规则,大家可以借鉴一下
Report类名取名方法为——***Report
*** 取名必须和报表名前缀相对应——报表名:*@@@.ralx
***Report中方法取名为——***@@@DataSource
Report中方法名需和报表名相互对应
//GetReportSourscesEnum 此名称为我所有类中的方法集合的枚举
//GetReportName 此名称为我所有需要判断的类名的集合
Type reportSources = typeof(GetReportSourscesEnum); //创建 枚举Enum Type
FieldInfo[] sourcesFieldinfo = reportSources.GetFields(); //获取枚举Enum Type中的参数名
for (int u = 1; u < sourcesFieldinfo.Length; u++)
{
if (sourcesFieldinfo[u].Name.Contains(repName))
{
var i = repName.Split('_')[0]; //获取repName 的前缀,根据repName的前缀进行判断需要执行哪个类中的方法
Type getreportNames = typeof(GetReportName);
FieldInfo[] nameFieldInfo = getreportNames.GetFields();
for (int y = 1; y < nameFieldInfo.Length; y++)
{
if (nameFieldInfo[y].Name.Contains(i + "Report"))
{
string strClass = "MVC_LocateDataSource." + i + "Report"; // 命名空间+类名
string strMethod = repName + "DataSource"; // 方法名
type = Type.GetType(strClass); // 通过类名获取同名类
obj = Activator.CreateInstance(type, requestId); // 创建实例
return new _GetReportSources(strMethod, type, obj).Document_LocateDataSource;
}
}
}
}