Это рефакторинг с разным литьем класса и свойства называть можно ?


Я могу рефакторинг кода ?

Различн между этими блок кода.

  1. Они используют различные виды литья.
  2. Они называют различными собственность

        var objBillOfMaterialRow = (MISheetDataSet.BillOfMaterialRow)pObjDataset.Tables["BillOfMaterial"].Rows[0];
        if (objBillOfMaterialRow.mi1_BillOfMaterial == ShowReport.False)
        {
            pObjDataset.Tables["BillOfMaterial"].Clear();
        }
    
        var objLayerBuildUpRow= (MISheetDataSet.LayerRow)pObjDataset.Tables["LayerBuildUp"].Rows[0];
        if (objLayerBuildUpRow.mi1_LayerBuildUp == ShowReport.False)
        {
            pObjDataset.Tables["LayerBuildUp"].Clear();
        }
    
        var objConstructionRow = (MISheetDataSet.ConstructionRow)pObjDataset.Tables["Construction"].Rows[0];
        if (objConstructionRow.mi2_Construction == ShowReport.False)
        {
            pObjDataset.Tables["Construction"].Clear();
        }
    


305
2
c#
задан 17 мая 2011 в 09:05 Источник Поделиться
Комментарии
1 ответ

Это должно работать, если вы не хотите ничего менять в классах:

var rows = new Dictionary<string, Func<DataRow, ShowReport>>
{
{"BillOfMaterial", dr => ((MISheetDataSet.BillOfMaterialRow)dr).mi1_BillOfMaterial},
{"LayerBuildUp", dr => ((MISheetDataSet.LayerRow)dr).mi1_LayerBuildUp},
{"Construction", dr => ((MISheetDataSet.ConstructionRow)dr).mi2_Construction},
};

foreach (var row in rows)
{
var dataRow = pObjDataset.Tables[row.Key].Rows[0];
var showReportExtractor = row.Value;
var showReport = showReportExtractor(dataRow);
if (showReport == ShowReport.False)
pObjDataset.Tables[row.Key].Clear();
}

(Не забудьте дать осмысленные имена переменных)

Но я хотел бы рассмотреть рефакторинг классов, чтобы разрешить более простым добыча этих mi1_BillOfMaterial, mi1_LayerBuildUp, mi2_Construction членов. У вас есть три класса здесь, каждый из них имеет ShowReport собственность, но с разными именами. Идея в том, чтобы извлечь базовый класс, который будет иметь этот объект, в этом случае нам не нужно знать точный тип строки:

public abstract class RowBase
{
public abstract ShowReport ShowReport { get; }
}

public class BillOfMaterialRow : RowBase
{
public override ShowReport ShowReport { get { return mi1_BillOfMaterial; } }
}

// Two other classes implemented in the same way

И тогда ваш метод будет так же просто, как:

var rows = new []
{
"BillOfMaterial",
"LayerBuildUp",
"Construction",
};

foreach (var tableName in rows)
{
var row = (RowBase)pObjDataset.Tables[tableName].Rows[0];
if (row.ShowReport == ShowReport.False)
pObjDataset.Tables[tableName].Clear();
}

4
ответ дан 17 мая 2011 в 10:05 Источник Поделиться