将字符串转换为?
问题描述:
我正在构建一个动态计算框架,它将根据这些类型的计算类型和属性构建一个通用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_X
或set_Y
)。
的类型字段的是(当然)int?
(可为空的INT),但我可以使用:
PropertyInfo.PropertyType.GetGenericArguments();
方法来获得Int32
型(或Int64
,取其可能是这种情况)。
所以,因为我能最终有一个Type
对象的实例,任何人都可以推荐一个通用的方法来String
转换成该类型
我所考虑的是:
- 实现一个在我AdderCalculator字符串setter方法:
set_X(String s)
- 更改我的控制类型
NumericUpDown
,因为它会返回一个Decimal
- 变化的典型E要
Decimal
,但Decimal
不能直接从String
既转换(它可以使用解析,但毕竟是从一个普通的角度看
任何人都可以提供额外的观点强硬?
答
刚刚得到的答案在哪里可以清楚地看到,我结束了代码:
// 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]:http://*.com/questions/312858/how-can-i-convert-types-at-runtime – nikeaa 2013-02-11 21:29:35
@nikeaa - 感谢,看起来像“对象o =转换。 ChangeType(c.Text,ti);'将为我所需要的工作。仍然需要小心并处理异常情况。我发誓我搜索了一个小时如何做到这一点,我想我的搜索太狭窄了......欣赏指针。 – 2013-02-11 21:53:05