356 votes

Convert.ChangeType() échoue sur les types Nullables

Je veux convertir une chaîne en une valeur de propriété d'un objet, dont le nom est une chaîne. J'essaie de le faire de la manière suivante :

string modelProperty = "Some Property Name";
string value = "SomeValue";
var property = entity.GetType().GetProperty(modelProperty);
if (property != null) {
    property.SetValue(entity, 
        Convert.ChangeType(value, property.PropertyType), null);
}

Le problème est que cette opération échoue et génère une exception Invalid Cast lorsque le type de propriété est un type nullable. Il ne s'agit pas d'un cas où les valeurs ne peuvent pas être converties - elles fonctionnent si je le fais manuellement (par ex. DateTime? d = Convert.ToDateTime(value); ) J'ai vu des questions similaires mais je n'arrive toujours pas à le faire fonctionner.

1 votes

J'utilise ExecuteScalar<int?> avec PetaPoco 4.0.3 et cela échoue pour la même raison : return (T)Convert.ChangeType(val, typeof(T)) à la ligne 554

2voto

AnishJain87 Points 11

Je l'ai fait de cette façon

public static List<T> Convert<T>(this ExcelWorksheet worksheet) where T : new()
    {
        var result = new List<T>();
        int colCount = worksheet.Dimension.End.Column;  //get Column Count
        int rowCount = worksheet.Dimension.End.Row;

        for (int row = 2; row <= rowCount; row++)
        {
            var obj = new T();
            for (int col = 1; col <= colCount; col++)
            {

                var value = worksheet.Cells[row, col].Value?.ToString();
                PropertyInfo propertyInfo = obj.GetType().GetProperty(worksheet.Cells[1, col].Text);
                propertyInfo.SetValue(obj, Convert.ChangeType(value, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType), null);

            }
            result.Add(obj);
        }

        return result;
    }

1voto

hs586sd46s Points 1

Merci @LukeH
J'ai changé un peu :

public static object convertToPropType(PropertyInfo property, object value)
{
    object cstVal = null;
    if (property != null)
    {
        Type propType = Nullable.GetUnderlyingType(property.PropertyType);
        bool isNullable = (propType != null);
        if (!isNullable) { propType = property.PropertyType; }
        bool canAttrib = (value != null || isNullable);
        if (!canAttrib) { throw new Exception("Cant attrib null on non nullable. "); }
        cstVal = (value == null || Convert.IsDBNull(value)) ? null : Convert.ChangeType(value, propType);
    }
    return cstVal;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X