我试图通过反射获取float属性,并使用其ToString(IFormatProvider)方法设置另一个属性(字符串类型)。 我收到“ Reflection.TargetException,对象与目标类型不匹配”错误。我将在下面放置一些代码来解释它:
public class myForm : Form
{
public float myFloat { get; set; } = 2.78f;
public string myString { get; set; } = "127";
private void button2_Click(object sender, EventArgs e)
{
//Get "myFloat" property of this instance of Form.
PropertyInfo myfloat_property = this.GetType().GetProperty("myFloat");
//Get ToString(IFormatProvider) method of the "myFloat" property.
MethodInfo to_string = myfloat_property.PropertyType.GetMethod("ToString", new Type[] { typeof(IFormatProvider) });
//Set "myString" property. Where i get the exception.
myString = (string)to_string.Invoke(myfloat_property, new object[] { CultureInfo.InvariantCulture });
}
}
我认为我缺少一些容易看到的东西。但是我现在看不到,你能告诉我吗?
谢谢。
答案 0 :(得分:0)
当您将错误的this
对象传递给Invoke()
方法时,即表示该对象的类型与所声明的调用方法的类型不同时,会出现该错误。
在您的情况下,这是因为您要传递PropertyInfo
对象myfloat_property
,而实际上您应该传递属性本身的值。例如:
public class myForm : Form
{
public float myFloat { get; set; } = 2.78f;
public string myString { get; set; } = "127";
private void button2_Click(object sender, EventArgs e)
{
//Get "myFloat" property of this instance of Form.
PropertyInfo myfloat_property = this.GetType().GetProperty("myFloat");
//Get ToString(IFormatProvider) method of the "myFloat" property.
MethodInfo to_string = myfloat_property.PropertyType.GetMethod("ToString", new Type[] { typeof(IFormatProvider) });
//Set "myString" property. Where i get the exception.
myString = (string)to_string.Invoke(myfloat_property.GetValue(this), new object[] { CultureInfo.InvariantCulture });
}
}
现在,说的是,您的问题中有两点不清楚。上面的代码将解决该异常。但这似乎并不是达到最终结果的最佳方法。例如,您已经可以访问属性本身,因此可以直接使用属性,而不必使用PropertyInfo
对象:
public class myForm : Form
{
public float myFloat { get; set; } = 2.78f;
public string myString { get; set; } = "127";
private void button2_Click(object sender, EventArgs e)
{
//Get ToString(IFormatProvider) method of the "myFloat" property.
MethodInfo to_string = myFloat.GetType().GetMethod("ToString", new Type[] { typeof(IFormatProvider) });
//Set "myString" property. Where i get the exception.
myString = (string)to_string.Invoke(myFloat, new object[] { CultureInfo.InvariantCulture });
}
}
但是,即使那样看起来也过于复杂。毕竟,不仅可以访问该属性,而且ToString()
方法也可以访问。因此,您的方法实际上可能如下所示:
public class myForm : Form
{
public float myFloat { get; set; } = 2.78f;
public string myString { get; set; } = "127";
private void button2_Click(object sender, EventArgs e)
{
myString = myFloat.ToString(CultureInfo.InvariantCulture);
}
}
完全不需要反射。也不例外。 :)