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;
}

(空白を許して、読みやすさをあまり犠牲にせずに、できるだけサイズを小さくしようとしました)。

null許容型を使用して、未設定の値と設定済みの値を区別できるようにしています

現在、GUIでは、TextBoxesを使用して入力情報を収集しています。からTextBox、テキスト(文字列)しか取得できません。リフレクションを使用して、プロパティの名前を知っており、セッター(set_Xまたはset_Yこの場合)を取得できます。

The type of the field is (of course) int? (nullable int), but I can use:

 PropertyInfo.PropertyType.GetGenericArguments();

method to get the Int32 type (or Int64, whichever may be the case).

So, given that I can end up with a instance of a Type object, can anyone recommend a generic way to convert String to that type

What I have considered is:

  1. Implement a string setter method in my AdderCalculator: set_X(String s)
  2. Change my control type to NumericUpDown, as it will return a Decimal
  3. change the type to Decimal, but Decimal can't directly convert from String either (it can use parse, but that is tougher from a generic standpoint

Can anyone provide additional insight?

4

1 に答える 1

0

Just to get the answer out where it can be clearly seen, the code I ended up with is:

            // 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);
                    }
                }
            }

I still need to add some exception protection for invalid values, but this works with the property type being any numeric type (byte, short, int, int32, int64, float, double, Decimal, etc...)

于 2013-02-12T15:53:42.657 に答える