2013-02-11 249 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等等)