Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在执行期间对从抽象类派生的类进行个性化设置_C# - Fatal编程技术网

C# 在执行期间对从抽象类派生的类进行个性化设置

C# 在执行期间对从抽象类派生的类进行个性化设置,c#,C#,在下面的代码中,我想知道如何识别正在执行的类,以便通过应用开关大小写对其进行个性化设置。我试着检查参数T,但是它对我不起作用 提前谢谢 ExecuteCalculationsWith<RoofMaterialQuantityCalculator>(); ExecuteCalculationsWith<WallMaterialQuantityCalculator>(); ExecuteCalculationsWith<CurtainWallPanelsMaterial

在下面的代码中,我想知道如何识别正在执行的类,以便通过应用开关大小写对其进行个性化设置。我试着检查参数T,但是它对我不起作用

提前谢谢

ExecuteCalculationsWith<RoofMaterialQuantityCalculator>();
ExecuteCalculationsWith<WallMaterialQuantityCalculator>();
ExecuteCalculationsWith<CurtainWallPanelsMaterialQuantityCalculator>();
ExecuteCalculationsWith<FloorMaterialQuantityCalculator>();

private void ExecuteCalculationsWith<T>() where T : MaterialQuantityCalculator, new()
{
    T calculator = new T();
    calculator.SetDocument(m_doc);
    calculator.CalculateMaterialQuantities();

    switch (typeof(T))
    {
        case RoofMaterialQuantityCalculator:
            calculator.InsertDataTableintoSQLTableusingSQLBulkCopy();
            break;
        case WallMaterialQuantityCalculator:
            calculator.InsertDataTableintoSQLTable_walls();
            break;
        default:
            break;
    }
}
ExecuteCalculationsWith();
ExecuteCalculationWith();
ExecuteCalculationWith();
ExecuteCalculationWith();
私有void ExecuteCalculationWith(),其中T:MaterialQuantityCalculator,new()
{
T计算器=新的T();
计算器.SetDocument(m_doc);
calculator.CalculateMaterialQuantilities();
开关(类型(T))
{
箱顶材料数量计算器:
calculator.InsertDataTableintoSQLTableusingSQLBulkCopy();
打破
箱壁材料数量计算器:
calculator.InsertDataTableintoSQLTable_walls();
打破
违约:
打破
}
}

您可以使用
类型的
运算符。但是您不能在
类型
实例上切换

(您可以
类型
实例的
名称
属性上切换
,但我不建议这样做,因为它不可靠/不可维护/不可重构)

试着这样做:

private void ExecuteCalculationsWith<T>() where T : MaterialQuantityCalculator, new()
{
    T calculator = new T();
    calculator.SetDocument(m_doc);
    calculator.CalculateMaterialQuantities();       

    Type t = typeof(T);
    if (t == typeof(RoofMaterialQuantityCalculator))
        calculator.InsertDataTableintoSQLTableusingSQLBulkCopy();
    else if (t == typeof(WallMaterialQuantityCalculator))
        calculator.InsertDataTableintoSQLTable_walls();
}  
private void ExecuteCalculationsWith(),其中T:MaterialQuantityCalculator,new()
{
T计算器=新的T();
计算器.SetDocument(m_doc);
calculator.CalculateMaterialQuantilities();
类型t=类型(t);
if(t==类型(屋顶材料数量计算器))
calculator.InsertDataTableintoSQLTableusingSQLBulkCopy();
else if(t==类型(墙材料数量计算器))
calculator.InsertDataTableintoSQLTable_walls();
}  

您可以使用
类型的
运算符。但是您不能在
类型
实例上切换

(您可以
类型
实例的
名称
属性上切换
,但我不建议这样做,因为它不可靠/不可维护/不可重构)

试着这样做:

private void ExecuteCalculationsWith<T>() where T : MaterialQuantityCalculator, new()
{
    T calculator = new T();
    calculator.SetDocument(m_doc);
    calculator.CalculateMaterialQuantities();       

    Type t = typeof(T);
    if (t == typeof(RoofMaterialQuantityCalculator))
        calculator.InsertDataTableintoSQLTableusingSQLBulkCopy();
    else if (t == typeof(WallMaterialQuantityCalculator))
        calculator.InsertDataTableintoSQLTable_walls();
}  
private void ExecuteCalculationsWith(),其中T:MaterialQuantityCalculator,new()
{
T计算器=新的T();
计算器.SetDocument(m_doc);
calculator.CalculateMaterialQuantilities();
类型t=类型(t);
if(t==类型(屋顶材料数量计算器))
calculator.InsertDataTableintoSQLTableusingSQLBulkCopy();
else if(t==类型(墙材料数量计算器))
calculator.InsertDataTableintoSQLTable_walls();
}  

如果
MaterialQuantityCalculator
类有一个类似
InsertDataTableIntoSqlTable()
抽象
方法,然后每个派生计算器都实现了它,这样您的泛型方法就会如下所示:

private void ExecuteCalculationsWith()
其中T:MaterialQuantityCalculator,new()
{
T计算器=新的T();
计算器.SetDocument(m_doc);
calculator.CalculateMaterialQuantilities();
calculator.InsertDataTableIntoSqlTable();
}
公共抽象类MaterialQuantityCalculator
{
公共抽象void InsertDataTableIntoSqlTable();
//为清楚起见,省略了其余部分
}
公共类屋顶材料数量计算器:材料数量计算器
{
public override void insertdatatabletosqltable()
{
//InsertDataTableintoSQLTableusingSQLBulkCopy()方法的内容出现在这里
}
//为清楚起见,省略了其余部分
}
公共类WallMaterialQuantityCalculator:材质QuantityCalculator
{
public override void insertdatatabletosqltable()
{
//InsertDataTableintoSQLTable_walls()方法的内容出现在这里
}
//为清楚起见,省略了其余部分
}

如果
MaterialQuantityCalculator
类有一个类似
InsertDataTableIntoSqlTable()
抽象
方法,然后每个派生计算器都实现了它,这样您的泛型方法就会如下所示:

private void ExecuteCalculationsWith()
其中T:MaterialQuantityCalculator,new()
{
T计算器=新的T();
计算器.SetDocument(m_doc);
calculator.CalculateMaterialQuantilities();
calculator.InsertDataTableIntoSqlTable();
}
公共抽象类MaterialQuantityCalculator
{
公共抽象void InsertDataTableIntoSqlTable();
//为清楚起见,省略了其余部分
}
公共类屋顶材料数量计算器:材料数量计算器
{
public override void insertdatatabletosqltable()
{
//InsertDataTableintoSQLTableusingSQLBulkCopy()方法的内容出现在这里
}
//为清楚起见,省略了其余部分
}
公共类WallMaterialQuantityCalculator:材质QuantityCalculator
{
public override void insertdatatabletosqltable()
{
//InsertDataTableintoSQLTable_walls()方法的内容出现在这里
}
//为清楚起见,省略了其余部分
}

你的意思是像
typeof(T)
?但这已经有了一种代码味道:泛型方法不需要知道具体的类型。是的,有没有办法知道(T)@RenéVogt的类型?是的,我试过这么做,但是当一个简单的抽象主类可以完成它或者甚至更好的时候,@RenéVogtall的代码就不起作用了。可以使用一个带有方法的接口,并且不需要切换。你的意思是
typeof(t)
?但这已经有了一种代码味道:泛型方法不需要知道具体的类型。是的,有没有办法知道(T)@RenéVogt的类型?是的,我试过这么做,但是@RenéVogatall没有工作,当一个简单的抽象主类可以完成它或者甚至更好的时候,可以使用一个带有方法的接口,并且不需要任何开关时,
ExecuteCalculationsWith
只能是
MaterialQuantityCalculator
中的一个方法ExecuteCalculationsWith
只能是中的一个方法
MaterialQuantityCalculator