Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串转换为?_C#_Winforms_Reflection - Fatal编程技术网

C# 将字符串转换为?

C# 将字符串转换为?,c#,winforms,reflection,C#,Winforms,Reflection,我正在构建一个动态计算框架,它将基于计算类型和这些类型上的属性构建一个通用GUI 例如,我可能有一个简单的加法器计算器(请原谅它的简单性,但在组合框架时,我喜欢从简单开始,然后逐步向上),它看起来是这样的: [CalculatorAttribute("This calculator add X+Y=Z")] class AdderCalculator : CalculatorBase { [CalculationValueAttribute(InputOutputEnum.InputVa

我正在构建一个动态计算框架,它将基于计算类型和这些类型上的属性构建一个通用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
,我只能获取文本(字符串)。使用反射,我知道属性的名称并可以获取它的setter(
set_X
set_Y

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

 PropertyInfo.PropertyType.GetGenericArguments();
方法获取
Int32
类型(或
Int64
,以情况为准)

因此,假设我可以得到一个
类型
对象的实例,有人能推荐一种将
字符串
转换为该类型的通用方法吗

我所考虑的是:

  • 在我的加法器计算器中实现字符串设置器方法:
    set_X(字符串s)
  • 将我的控件类型更改为
    NumericUpDown
    ,因为它将返回一个
    Decimal
  • 将类型更改为
    Decimal
    ,但是
    Decimal
    也不能直接从
    String
    转换(它可以使用parse,但从通用角度来看,这更难)

  • 有人能提供更多的见解吗?

    为了得到清晰可见的答案,我最后的代码是:

                // 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等)

    查看[此问题][1]的任何答案是否有用?[1]:@nikeaa-谢谢,看起来像'object o=Convert.ChangeType(c.Text,ti)。