2013-02-11 224 views
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,我使用TextBox ES收集的输入信息。从TextBox,我只能得到文本(字符串)。使用反射,我知道财产的名称,并可以得到它的设置(在这种情况下,set_Xset_Y)。

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

PropertyInfo.PropertyType.GetGenericArguments(); 

方法来获得Int32型(或Int64,取其可能是这种情况)。

所以,因为我能最终有一个Type对象的实例,任何人都可以推荐一个通用的方法来String转换成该类型

我所考虑的是:

  1. 实现一个在我AdderCalculator字符串setter方法:set_X(String s)
  2. 更改我的控制类型NumericUpDown,因为它会返回一个Decimal
  3. 变化的典型E要Decimal,但Decimal不能直接从String既转换(它可以使用解析,但毕竟是从一个普通的角度看

任何人都可以提供额外的观点强硬?

+1

看看[这个问题] [1]的答案是否有帮助? [1]:http://stackoverflow.com/questions/312858/how-can-i-convert-types-at-runtime – nikeaa 2013-02-11 21:29:35

+0

@nikeaa - 感谢,看起来像“对象o =转换。 ChangeType(c.Text,ti);'将为我所需要的工作。仍然需要小心并处理异常情况。我发誓我搜索了一个小时如何做到这一点,我想我的搜索太狭窄了......欣赏指针。 – 2013-02-11 21:53:05

回答

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

我还需要添加无效值一些例外的保护,但这种工作原理与性能类型是任何数字类型(byte,short,int,int32,int64,float,double,Decimal等等)