ArgumentException en PropertyInfo.SetValue () en .Net Compact

.net c# compact-framework dapper dapper-lite

Pregunta

Estoy usando DapperLite , un puerto de Dapper , para usar en Compact Framework. Obtengo una ArgumentException , ninguna otra información en el siguiente método en la línea especificada del archivo SqlMapper.cs .

Realmente luchando con qué buscar a continuación o qué está realmente roto.

/// <summary>
    /// Populate a references type from an IDataRecord by matching column names to property names.
    /// </summary>
    private static void PopulateClass(object objectClass, IDataRecord reader)
    {
        Type theType = objectClass.GetType();
        PropertyInfo[] p = theType.GetProperties();


        // Only set properties which match column names in the result.
        foreach (string columnName in GetColumnNames(reader))
        {
            string colName = columnName;
            object value = reader[colName];
            PropertyInfo pi = p.FirstOrDefault(x => x.Name == colName);


            if (pi == null || value == DBNull.Value) continue;


            Type columnType = value.GetType();
            Type actualType = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType;


            // Check for a directly assignable type
            if (actualType == columnType || actualType == typeof(string) || actualType == typeof(int))
            {
                // Error generated here
                pi.SetValue(objectClass, value, null);
            }
            else
            {
                value = actualType.GetMethod("Parse", new[] { typeof(string) }).Invoke(null, new[] { value });
                pi.SetValue(objectClass, value, null);
            }
        }
    }

Los valores en ese punto son objectClass = Models.Employee y value=1 . El colName , de más arriba en el Método, es Id que es una int en el modelo de Employee .


Modelo de empleado agregado basado en el comentario:

namespace BioPadPunchClock.Models
{
    public class Employee
    {
        public int Id { get; set; }
        public int CDB_Employee_PK { get; set; }  //Employee PK in the Central DB. If .null., new emp record on this timeclock needs to be pushed to the CDB.
        public string Name { get; set; }
        //public string FaceImage { get; set; }  //path to Jpeg image 136x90 pixels .\NAND\pictures\  named as <pk>.jpg
        public DateTime? BirthDate { get; set; }
        public string Status { get; set; }  //Full Time – Hourly, Inactive, Terminated, Part Time - Hourly  
        public DateTime? LastPunch { get; set; }
        public string LastPunchDirection { get; set; }  //IN or OUT
        public string PIN { get; set; }  // 4 digit
        public int CardNum { get; set; }  //HID Card Number
        public int CardFacCode { get; set; }  //HID Card Facility Code
        public string FpTemplate { get; set; }  //Fingerprint Template (registered fingerprint)
        public DateTime? LastUpdate { get; set; }  //When this employee record was last sync’d to the CDB. This value will match exactly in the LDB and CDB after a successful sync.
        public int DayTotal { get; set; } // Minutes cumulative for the current day at time of last punch
        public int PayPeriodTotal { get; set; } //Minutes cumulative for the current pay period at time of last punch
        public string Department { get; set; }
        public string SSN { get; set; }
        public bool ShouldPromptDept { get; set; } //Prompt employee to choose department each time
    }
}

Otros hallazgos ...

Cuando miro mi Model.Employee en ese punto, todas las propiedades de la string dicen que Could not evaluate expression con un signo de exclamación rojo. ¿Es esto una pista o normal?


Otros hallazgos ...

No estoy seguro de si esto importa o no, pero cuando paso por el código e inspecciono los valores, noto que el tipo actualType == Int32 y el tipo de columnType==Int64 mientras que el value que está evaluando es 1 .

No estoy seguro de que haya alguna diferencia ya que hay un actualType.Equals(typeof(int)) pero pensé que lo mencionaría.

Respuesta aceptada

Lo descubrimos en GitHub con la última información.

Dado que columnType es Int64 para la columna Id , al cambiar el tipo de la columna Id en el modelo a Int64 se solucionará este problema.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow