Эта ошибка появляется, когда вы передаете неправильный объект 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);
}
}
Нет необходимости в отражении. И никаких исключений. :)