0

我正在构建一个动态计算框架,它将基于这些类型的计算类型和属性构建一个通用 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 中,我使用TextBoxes 来收集输入信息。从TextBox,我只能得到文本(字符串)。使用反射,我知道属性的名称并且可以获取它的设置器(set_X或者set_Y在这种情况下)。

该字段的类型(当然)是int?(可为空的 int),但我可以使用:

 PropertyInfo.PropertyType.GetGenericArguments();

获取Int32类型的方法(或Int64,视情况而定)。

因此,鉴于我最终可以得到一个Type对象的实例,任何人都可以推荐一种通用方法来转换String为该类型

我考虑的是:

  1. 在我的 AdderCalculator 中实现一个字符串设置方法:set_X(String s)
  2. 将我的控件类型更改为NumericUpDown,因为它将返回一个Decimal
  3. 将类型更改为Decimal,但Decimal不能直接从String任何一个转换(它可以使用解析,但从通用的角度来看这更难

任何人都可以提供额外的见解吗?

4

1 回答 1

0

只是为了在可以清楚地看到答案的地方找到答案,我最终得到的代码是:

            // collect relevant inputs
            foreach (Control c in fPanelIn.Controls)
            {
                if (c.Tag is PropertyInfo) 
                {
                    PropertyInfo pi = c.Tag as PropertyInfo;

                    if(c.Text.Length>0)
                    {
                        Type ti = pi.PropertyType;

                        if (ti.IsGenericType)
                        {
                            ti = ti.GetGenericArguments()[0];
                        }
                        object o = Convert.ChangeType(c.Text, ti);

                        pi.SetValue(Calculator, o, null);

                        //MethodInfo mi = calcType.GetMethod(ConstructMethodName(pi), new Type[] { typeof(String) });

                        //mi.Invoke(Calculator, new object[] { c.Text });
                    }
                    else
                    {
                        pi.SetValue(Calculator, null, null);
                    }
                }
            }

我仍然需要为无效值添加一些异常保护,但这适用于任何数字类型(字节、短、整数、int32、int64、浮点、双精度、小数等)的属性类型

于 2013-02-12T15:53:42.657 回答