C# 反射,Reflection.TargetException,当调用 ToString(IFormatProvider) 时
C# Reflection, Reflection.TargetException, when Invoke ToString(IFormatProvider)
我正在尝试使用反射获取浮点数 属性 并使用其 ToString(IFormatProvider) 方法设置另一种 属性 字符串类型。
我收到 "Reflection.TargetException, Object does not match target type" 错误。我将在下面放一些代码来解释它:
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 });
}
}
我想我遗漏了一些容易看到的东西。但是我现在看不到,你能告诉我吗?
谢谢大家
当您将错误的 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);
}
}
根本不需要反思。没有例外。 :)
我正在尝试使用反射获取浮点数 属性 并使用其 ToString(IFormatProvider) 方法设置另一种 属性 字符串类型。 我收到 "Reflection.TargetException, Object does not match target type" 错误。我将在下面放一些代码来解释它:
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 });
}
}
我想我遗漏了一些容易看到的东西。但是我现在看不到,你能告诉我吗?
谢谢大家
当您将错误的 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);
}
}
根本不需要反思。没有例外。 :)