Вы должны иметь возможность использовать Lambdas для покрытия специфичных для типа частей повторяющегося кода.Это какой-то почти псевдокод, который я взломал вместе ...
void TableIsJob(Job j, BindingFlags b) {
HandleTable("Job", j.JobID, typeof(Job).GetProperties(b),
p=>p.GetGetMethod().Invoke(j, null));
}
void TableIsEstimation(Estimation e, BindingFlags b) {
HandleTable("Estimation", e.EstimationID, typeof(Estimation).GetProperties(b),
p => p.GetGetMethod().Invoke(e, null));
}
void HandleTable(string nm, int ID, PropertyInfo [] props, Func<PropertyInf, Object> i) {
string desc = string.Join(Environment.NewLine, props.Select(p=>{
return string.Format("{0}: {1}", p.Name,
StripDate(i(p)));
}).ToArray());
Audit(JobID, desc, string.Format("New {0} created", nm),
SourceID, "", id);
}
И тогда вы можете заменить свой огромный цикл for и switch на ...
Tables.Select(t =>
{
switch (t.ToString().Replace("Project.", ""))
{
case "Job":
TableIsJob((Job)t, b);
break;
case "Estimation":
TableIsEstimation((Estimation)t, b);
break;
}
});
Этовсе предполагая, что «эффективный» означает с точки зрения объема кода, а не во время выполнения.