C # Reflection, Reflection.TargetException, когда вызывается ToString (IFormatProvider) - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь получить свойство 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 });
        }
}

Я думаю, что упускаю что-то, что легко увидеть. Но я не вижу этого сейчас, ты можешь показать мне?

Спасибо всем.

1 Ответ

0 голосов
/ 08 июля 2019

Эта ошибка появляется, когда вы передаете неправильный объект 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);
    }
}

Нет необходимости в отражении. И никаких исключений. :)

...