我正在构建一个动态计算框架,它将基于这些类型的计算类型和属性构建一个通用 GUI。
例如,我可能有一个简单的加法器计算器(请原谅它的简单性,但是在组合框架时,我喜欢从简单的开始,然后逐步向上),它看起来像这样:
[CalculatorAttribute("This calculator add X+Y=Z")]
class AdderCalculator : CalculatorBase
{
[CalculationValueAttribute(InputOutputEnum.InputValue, "First Input")]
public int? X
{
set { m_X = value; m_Z = null;}
get { return m_X; }
}
[CalculationValueAttribute(InputOutputEnum.InputValue, "Second Input")]
public int? Y
{
set{ m_Y = value; m_Z = null;}
get { return m_Y; }
}
[CalculationValueAttribute(InputOutputEnum.OutputValue, "Output")]
public int? Z
{
get { return m_Z; }
}
public AdderCalculator()
{
m_X = m_Y = m_Z = null;
}
public override Boolean ReadyToCalc()
{
return (m_X != null && m_Y != null);
}
public override Boolean NeedToCalc()
{
return (m_Z == null);
}
public override void Calculate()
{
if(ReadyToCalc()){ m_Z = m_X + m_Y;}
}
private int? m_X, m_Y, m_Z;
}
(请原谅空格,我试图在不牺牲太多可读性的情况下尽可能减小大小)。
我正在使用可为空的类型来区分未设置的值和设置的值
现在,在我的 GUI 中,我使用TextBox
es 来收集输入信息。从TextBox
,我只能得到文本(字符串)。使用反射,我知道属性的名称并且可以获取它的设置器(set_X
或者set_Y
在这种情况下)。
该字段的类型(当然)是int?
(可为空的 int),但我可以使用:
PropertyInfo.PropertyType.GetGenericArguments();
获取Int32
类型的方法(或Int64
,视情况而定)。
因此,鉴于我最终可以得到一个Type
对象的实例,任何人都可以推荐一种通用方法来转换String
为该类型
我考虑的是:
- 在我的 AdderCalculator 中实现一个字符串设置方法:
set_X(String s)
- 将我的控件类型更改为
NumericUpDown
,因为它将返回一个Decimal
- 将类型更改为
Decimal
,但Decimal
不能直接从String
任何一个转换(它可以使用解析,但从通用的角度来看这更难
任何人都可以提供额外的见解吗?