0

データベースとの通信を処理するフレームワークがあります。オブジェクトのプロパティ名とパラメーターの名前を一致させることにより、SP (search、ins、del、upd) を呼び出してパラメーターを自動的に埋めます。数値のみを含む文字列値を取得し、最初の数値がゼロになるまで、すべてがうまく機能していました。私のプロパティとDB列の両方が文字列であっても、コードは先行ゼロを自動的に削除しています。ここに私のコードの一部があります:

var property = from p in entityProperties
               where p.Name.ToUpper().Equals(dvSchema[index][0].ToString().ToUpper())
               select p;
object propertyNewValue;
if (property.First().PropertyType.BaseType != typeof(Enum))
    propertyNewValue = dr[index];
...
property.First().SetValue(businessEntity, propertyNewValue, null);

.NET 3.5 と SQL Server2008 を使用しています

プロパティの型が文字列かどうかを確認するために if を追加する以外に、これを回避する方法を誰かが知っていますか?

前もって感謝します!


編集

これが私の完全な手順です。プロパティをどこにも明示的にキャストしません。

    public virtual void MapEntityFromDataBase(BE businessEntity, IDataReader dr)
    {
        DataView dvSchema = dr.GetSchemaTable().DefaultView;
        Type thisType = businessEntity.GetType();
        while (thisType != typeof(Object))
        {
            PropertyInfo[] entityProperties = thisType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            for (int index = 0; index < dvSchema.Count; index++)
            {
                if (dr[index] != DBNull.Value)
                {
                    var property = from p in entityProperties
                                   where p.Name.ToUpper().Equals(dvSchema[index][0].ToString().ToUpper())
                                   select p;
                    if (property.Count() > 0)
                    {
                        object propertyNewValue;
                        if (property.First().PropertyType.BaseType != typeof(Enum))
                        {
                            propertyNewValue = dr[index];
                        }
                        else //enums throw a cast exception
                        {
                            if (dr[index].GetType() == typeof(string) || dr[index].GetType() == typeof(char))
                                propertyNewValue = Enum.Parse(property.First().PropertyType, ((int)dr[index].ToString()[0]).ToString());
                            else
                                propertyNewValue = Enum.Parse(property.First().PropertyType, dr[index].ToString());
                        }
                        if (property.First().CanWrite)
                        {
                            if (property.First().PropertyType.IsGenericType && property.First().PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                            {
                                Type[] typeCol = property.First().PropertyType.GetGenericArguments();
                                Type nullableType;
                                if (typeCol.Length > 0)
                                {
                                    nullableType = typeCol[0];
                                    if (nullableType.BaseType == typeof(Enum))
                                    {
                                        propertyNewValue = Enum.Parse(nullableType, propertyNewValue.ToString());
                                    }
                                }
                            }
                            property.First().SetValue(businessEntity, propertyNewValue, null);
                        }
                    }
                }
            }
            thisType = thisType.BaseType;
        }
    }

奇妙なことに、プロパティ設定文にたどり着くと

property.First().SetValue(businessEntity, propertyNewValue, null);

propertyNewValue の値は "091234" です (debbuger で確認)

4

0 に答える 0