Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Reflection,Reflection.TargetException,调用ToString时(IFormatProvider)_C#_Methods_Reflection_Invoke_Propertyinfo - Fatal编程技术网

C#Reflection,Reflection.TargetException,调用ToString时(IFormatProvider)

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;

我试图通过反射获取一个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 });
        }
}
我想我错过了一些容易看到的东西。但我现在看不见,你能给我看看吗


谢谢大家。

当您将错误的
对象传递给
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})这确实提出了一个问题,即为什么您需要对反射执行此操作,因为您可以从按钮单击处理程序中直接访问表单的属性。我为像我这样的人测试并编辑了这个问题。谢谢你的回答。我想我获得了一个如何/应该使用反射的新愿景。我不会像这样使用它。我需要这个,而不是那个。我只是简化了主题。我不会这样使用它。我需要这个,而不是那个。我只是简化了主题。