Rozważmy następujący przykładowy kod:
class SampleClass
{
public long SomeProperty { get; set; }
}
public void SetValue(SampleClass instance, decimal value)
{
// value is of type decimal, but is in reality a natural number => cast
instance.SomeProperty = (long)value;
}
Teraz muszę zrobić coś podobnego poprzez refleksję:
void SetValue(PropertyInfo info, object instance, object value)
{
// throws System.ArgumentException: Decimal can not be converted to Int64
info.SetValue(instance, value)
}
Zauważ, że nie mogę założyć, że PropertyInfo zawsze reprezentuje długość, ani ta wartość nie zawsze jest dziesiętna. Wiem jednak, że wartość można rzutować na odpowiedni typ dla tej właściwości.
Jak mogę przekonwertować parametr „value” na typ reprezentowany przez instancję PropertyInfo poprzez odbicie?
Convert.ChangeType(value, property.PropertyType);
nadal może się nie powieść, jeślivalue
nie zaimplementujeIConvertible
interfejsu. Na przykład, jeśliinfo.PropertyType
jest jakiśIEnumerable