UG二次开发,难免会有大量的修正表达式的需求,因为二开人员大都是设计人员半路出家,所以C#语言的精华大多不会用。
这里通过C#的反射原理实现一个通用的修正表达式的方法。
1、我想很多开发人员修正表达式的方法都是这样的:
/// <summary>
/// 修正表达式,硬编码
/// </summary>
/// <param name="expCol"></param>
/// <param name="expModel"></param>
public static void UpdateExp(ExpressionCollection expCol, ExpressionModel expModel)
{
Expression[] expressions = expCol.ToArray();
foreach (var ex in expressions)
{
if (ex.Name == "A")
{
ex.Value = expModel.A == 0.0 ? ex.Value : expModel.A;
}
if (ex.Name == "B")
{
ex.Value = expModel.B == 0.0 ? ex.Value : expModel.B;
}
if (ex.Name == "C")
{
ex.Value = expModel.C == 0.0 ? ex.Value : expModel.C;
}
if (ex.Name == "D")
{
ex.Value = expModel.D == 0.0 ? ex.Value : expModel.D;
}
if (ex.Name == "E")
{
ex.Value = expModel.E == 0.0 ? ex.Value : expModel.E;
}
if (ex.Name == "F")
{
ex.Value = expModel.F == 0.0 ? ex.Value : expModel.F;
}
if (ex.Name == "G")
{
ex.Value = expModel.G == 0.0 ? ex.Value : expModel.G;
}
if (ex.Name == "RD2")
{
ex.Value = expModel.RD2 == 0.0 ? ex.Value : expModel.RD2;
}
if (ex.Name == "RD3")
{
ex.Value = expModel.RD3 == 0.0 ? ex.Value : expModel.RD3;
}
if (ex.Name == "RD4")
{
ex.Value = expModel.RD4 == 0.0 ? ex.Value : expModel.RD4;
}
if (ex.Name == "RP1")
{
ex.Value = expModel.RP1 == 0.0 ? ex.Value : expModel.RP1;
}
if (ex.Name == "RP2")
{
ex.Value = expModel.RP2 == 0.0 ? ex.Value : expModel.RP2;
}
if (ex.Name == "RP3")
{
ex.Value = expModel.RP3 == 0.0 ? ex.Value : expModel.RP3;
}
if (ex.Name == "RP4")
{
ex.Value = expModel.RP4 == 0.0 ? ex.Value : expModel.RP4;
}
if (ex.Name == "X")
{
ex.Value = expModel.X == 0.0 ? ex.Value : expModel.X;
}
if (ex.Name == "Y")
{
ex.Value = expModel.Y == 0.0 ? ex.Value : expModel.Y;
}
if (ex.Name == "Z")
{
ex.Value = expModel.Z == 0.0 ? ex.Value : expModel.Z;
}
}
uFModl = theUFSession.Modl;
uFModl.Update();
}
2、通过反射修正表达式,是这样的:
第一步:定义表达式实体
public class ExpressionModel
{
public double A { get; set; }
public double B { get; set; }
public double C { get; set; }
public double D { get; set; }
public double E { get; set; }
public double F { get; set; }
public double G { get; set; }
public double RD2 { get; set; }
public double RD3 { get; set; }
public double RD4 { get; set; }
public double RP1 { get; set; }
public double RP2 { get; set; }
public double RP3 { get; set; }
public double RP4 { get; set; }
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
}
第二步:利用反射原理修正表达式,自动完全匹配
/// <summary>
/// 修正表达式,自动完全匹配
/// </summary>
/// <param name="expCol"></param>
/// <param name="expModel"></param>
public static void UpdateExpression(ExpressionCollection expCol, ExpressionModel expModel)
{
Expression[] expressions = expCol.ToArray();
foreach (var ex in expressions)
{
foreach (PropertyInfo pi in expModel.GetType().GetProperties())
{
double value = 0.0;
var name = pi.Name;
string strVal = pi.GetValue(expModel, null).ToString();
if (!string.IsNullOrEmpty(strVal))
{
value = double.Parse(strVal);
}
if (ex.Name == name)
{
ex.Value = value == 0.0 ? ex.Value : value;
}
}
}
}