如何简化重复调用不同GetValeur_XXX方法的C#代码?
问题背景
存在一段需重复编写的C#代码,每次仅需替换其中的GetValeur_XXX方法即可复用逻辑。这些方法返回不同结构体,仅ValueTagBdd的类型存在差异,需要重构以消除重复、提升复用性。
原重复代码示例:
try { if (_slideRange != null) { bool isSameTagValueBdd = true; QuizzDll.PowerPoints.PptTag_Slide_ByInterop firstTagSlide = new QuizzDll.PowerPoints.PptTag_Slide_ByInterop(_slideRange[1]); var result = firstTagSlide.GetValeur_CoefQuestion().ValueTagBdd; foreach (Slide slide in _slideRange) { QuizzDll.PowerPoints.PptTag_Slide_ByInterop objTagSlide = new QuizzDll.PowerPoints.PptTag_Slide_ByInterop(slide); if (objTagSlide.GetValeur_CoefQuestion().ValueTagBdd != result) { isSameTagValueBdd = false; break; } } if (isSameTagValueBdd) { return result; } } } catch (Exception ex) { Logger.WriteLog(DateTime.Now.ToString() + " - " + ex.Message + Environment.NewLine + ex.StackTrace, 3); }
解决方案
核心思路是提取通用逻辑,通过泛型+委托适配不同的GetValeur_XXX方法和ValueTagBdd类型,将重复的异常捕获、遍历比较逻辑封装为通用方法,调用时仅需传入获取目标值的委托。
1. 封装通用泛型方法
将重复逻辑抽象为以下泛型方法,支持任意类型的ValueTagBdd:
private T GetConsistentTagValue<T>(SlideRange slideRange, Func<QuizzDll.PowerPoints.PptTag_Slide_ByInterop, T> getValueTagBddFunc) { try { if (slideRange == null) return default; bool isSameTagValueBdd = true; var firstTagSlide = new QuizzDll.PowerPoints.PptTag_Slide_ByInterop(slideRange[1]); var result = getValueTagBddFunc(firstTagSlide); foreach (Slide slide in slideRange) { var objTagSlide = new QuizzDll.PowerPoints.PptTag_Slide_ByInterop(slide); var currentValue = getValueTagBddFunc(objTagSlide); if (!EqualityComparer<T>.Default.Equals(currentValue, result)) { isSameTagValueBdd = false; break; } } return isSameTagValueBdd ? result : default; } catch (Exception ex) { Logger.WriteLog($"{DateTime.Now} - {ex.Message}{Environment.NewLine}{ex.StackTrace}", 3); return default; } }
2. 调用通用方法
针对不同的GetValeur_XXX方法,只需传入对应的委托即可完成调用:
调用GetValeur_CoefQuestion(ValueTagBdd为double类型)
var coefResult = GetConsistentTagValue<double>(_slideRange, tagSlide => tagSlide.GetValeur_CoefQuestion().ValueTagBdd); if (coefResult != default) { return coefResult; }
调用GetValeur_MalusTemps(ValueTagBdd为string类型)
var malusResult = GetConsistentTagValue<string>(_slideRange, tagSlide => tagSlide.GetValeur_MalusTemps().ValueTagBdd); if (malusResult != null) { return malusResult; }
可选优化(若可修改VB代码)
如果允许修改VB侧的结构体定义,可以让所有struct_VALUE_TAG_XXX实现统一接口,进一步简化类型处理:
VB侧接口定义
Public Interface IValueTag ReadOnly Property ValueTagBdd As Object End Interface Public Structure struct_VALUE_TAG_DOUBLE Implements IValueTag Public ValueTag As String Public ValueTagBdd As Double Implements IValueTag.ValueTagBdd Public ValueAffichProp As String Public ValueAffichRapport As String Public ValueDesc As String Public ValueCaption As String End Structure Public Structure struct_VALUE_TAG_STRING Implements IValueTag Public ValueTag As String Public ValueTagBdd As String Implements IValueTag.ValueTagBdd Public ValueAffichProp As String Public ValueAffichRapport As String Public ValueDesc As String Public ValueCaption As String End Structure
C#侧通用方法调整
private T GetConsistentTagValue<T>(SlideRange slideRange, Func<QuizzDll.PowerPoints.PptTag_Slide_ByInterop, IValueTag> getValueFunc) { try { if (slideRange == null) return default; bool isSameTagValueBdd = true; var firstTagSlide = new QuizzDll.PowerPoints.PptTag_Slide_ByInterop(slideRange[1]); var result = (T)getValueFunc(firstTagSlide).ValueTagBdd; foreach (Slide slide in slideRange) { var objTagSlide = new QuizzDll.PowerPoints.PptTag_Slide_ByInterop(slide); var currentValue = (T)getValueFunc(objTagSlide).ValueTagBdd; if (!EqualityComparer<T>.Default.Equals(currentValue, result)) { isSameTagValueBdd = false; break; } } return isSameTagValueBdd ? result : default; } catch (Exception ex) { Logger.WriteLog($"{DateTime.Now} - {ex.Message}{Environment.NewLine}{ex.StackTrace}", 3); return default; } }
调用示例
var coefResult = GetConsistentTagValue<double>(_slideRange, tagSlide => tagSlide.GetValeur_CoefQuestion());
内容的提问来源于stack exchange,提问作者FlorianD
相关产品推荐
相关产品推荐

