C#Reflection,Reflection.TargetException,调用ToString时(IFormatProvider)
我试图通过反射获取一个float属性,并使用其ToString(IFormatProvider)方法设置另一个属性,即字符串类型。 我得到“Reflection.TargetException,对象与目标类型不匹配”错误。我将在下面放一些代码来解释它:C#Reflection,Reflection.TargetException,调用ToString时(IFormatProvider),c#,methods,reflection,invoke,propertyinfo,C#,Methods,Reflection,Invoke,Propertyinfo,我试图通过反射获取一个float属性,并使用其ToString(IFormatProvider)方法设置另一个属性,即字符串类型。 我得到“Reflection.TargetException,对象与目标类型不匹配”错误。我将在下面放一些代码来解释它: public class myForm : Form { public float myFloat { get; set; } = 2.78f; public string myString { get; set;
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 });
}
}
我想我错过了一些容易看到的东西。但我现在看不见,你能给我看看吗
谢谢大家。当您将错误的
此对象传递给Invoke()
方法时,您会收到该错误,即对象的类型与声明调用方法的类型不同
在您的情况下,这是因为您正在传递一个PropertyInfo
对象,myfloat\u属性
,而实际上您应该传递属性本身的值。例如:
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);
}
}
根本不需要思考。(没有例外。) 当您将错误的此
对象传递给Invoke()
方法时,会出现该错误,即对象的类型与声明调用方法的类型不同
在您的情况下,这是因为您正在传递一个PropertyInfo
对象,myfloat\u属性
,而实际上您应该传递属性本身的值。例如:
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);
}
}
根本不需要思考。(没有例外。) 您必须传递一个实例。你不能只是传递一个属性信息。您必须在类实例(表单)中调用GetValue传递,然后使用传递的结果,因为传递给ToString的实例知道它很容易看到,而我看不到它。谢谢你给我看。问题是,PropertyInfo myfloat_属性不是myfloat属性,因此使用myfloat_属性调用字符串MethodInfo会导致异常。它只是myFloat属性的“反映”,而不是它本身。我想我要掌握编程还有很长的路要走。谢谢,我有一条路要走。看起来是这样的。请注意,它未经测试,否则我会发布一个答案(另外我肯定这是一个重复的答案):myString=(string)到_string.Invoke(myfloat_property.GetValue(this),新对象[]{CultureInfo.InvariantCulture})代码>这确实提出了一个问题,即为什么您需要对反射执行此操作,因为您可以从按钮单击处理程序中直接访问表单的属性。我为像我这样的人测试并编辑了这个问题。谢谢你的回答。我想我获得了如何/应该使用反射的新愿景。你必须通过一个实例。你不能只是传递一个属性信息。您必须在类实例(表单)中调用GetValue传递,然后使用传递的结果,因为传递给ToString的实例知道它很容易看到,而我看不到它。谢谢你给我看。问题是,PropertyInfo myfloat_属性不是myfloat属性,因此使用myfloat_属性调用字符串MethodInfo会导致异常。它只是myFloat属性的“反映”,而不是它本身。我想我要掌握编程还有很长的路要走。谢谢,我有一条路要走。看起来是这样的。请注意,它未经测试,否则我会发布一个答案(另外我肯定这是一个重复的答案):myString=(string)到_string.Invoke(myfloat_property.GetValue(this),新对象[]{CultureInfo.InvariantCulture})代码>这确实提出了一个问题,即为什么您需要对反射执行此操作,因为您可以从按钮单击处理程序中直接访问表单的属性。我为像我这样的人测试并编辑了这个问题。谢谢你的回答。我想我获得了一个如何/应该使用反射的新愿景。我不会像这样使用它。我需要这个,而不是那个。我只是简化了主题。我不会这样使用它。我需要这个,而不是那个。我只是简化了主题。