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