private void ProcessGenericMethods(CoverageSession coverageSession) { CoveredMethodStats[] coveredMethodStats = Coverage.GetStatsForAllCoveredMethods(); foreach (CoveredMethodStats coveredMethodStat in coveredMethodStats) { MethodBase method = coveredMethodStat.method; ResultsLogger.LogSessionItem($"Processing generic method: {method.Name}", LogVerbosityLevel.Verbose); Type declaringType = method.DeclaringType; string assemblyName = declaringType.Assembly.GetName().Name.ToLower(); if (!m_ReporterFilter.ShouldProcessAssembly(assemblyName)) { ResultsLogger.LogSessionItem($"Excluded assembly from generic (Assembly Filtering): {assemblyName}", LogVerbosityLevel.Verbose); continue; } if (!(declaringType.IsGenericType || method.IsGenericMethod)) { continue; } Module module = Array.Find(coverageSession.Modules, element => element.ModuleName.ToLower() == assemblyName); if (module != null) { string className = string.Empty; if (declaringType.IsGenericType) { Type genericTypeDefinition = declaringType.GetGenericTypeDefinition(); className = GenerateTypeName(genericTypeDefinition); } else if (method.IsGenericMethod) { className = GenerateTypeName(declaringType); } Class klass = Array.Find(module.Classes, element => element.FullName == className); if (klass != null) { Method targetMethod = Array.Find(klass.Methods, element => element.MetadataToken == method.MetadataToken); if (targetMethod != null) { ResultsLogger.LogSessionItem($"Processing included generic method: {method.Name}", LogVerbosityLevel.Verbose); CoveredSequencePoint[] coveredSequencePoints = Coverage.GetSequencePointsFor(method); foreach (CoveredSequencePoint coveredSequencePoint in coveredSequencePoints) { SequencePoint targetSequencePoint = Array.Find(targetMethod.SequencePoints, element => (element.StartLine == coveredSequencePoint.line && element.Offset == coveredSequencePoint.ilOffset)); if (targetSequencePoint != null) { targetSequencePoint.VisitCount += (int)coveredSequencePoint.hitCount; } } } } } } }