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