2008年12月23日 星期二

Nullable data type conversion

今天寫了一個 function 來將 client post back 中 form 的資料寫回至物件中

不囉唆,直接看 code

        public static FormCollection FillTo(this FormCollection form, object target, Func<FormCollection, string, object> getValue)
        {
            Type targetType = target.GetType();
            foreach (var property in targetType.GetProperties())
            {
                //檢查 form 中有沒有值
                if (Array.IndexOf(form.AllKeys, property.Name) != -1)
                {
                    object value = getValue(form, property.Name);
 
                    if ((property.PropertyType == typeof(System.Guid)) || (property.PropertyType == typeof(System.Guid?)))
                        value = new Guid(value as string);
                    else if ((property.PropertyType == typeof(System.DateTime)) || (property.PropertyType == typeof(System.DateTime?)))
                        value = Convert.ToDateTime(value);
                    else if ((property.PropertyType == typeof(System.Int16)) || (property.PropertyType == typeof(System.Int16?)))
                        value = Convert.ToInt16(value);
                    else if ((property.PropertyType == typeof(System.Int32)) || (property.PropertyType == typeof(System.Int32?)))
                        value = Convert.ToInt32(value);
                    else if ((property.PropertyType == typeof(System.Int64)) || (property.PropertyType == typeof(System.Int64?)))
                        value = Convert.ToInt64(value);
                    else if ((property.PropertyType == typeof(System.Byte)) || (property.PropertyType == typeof(System.Byte?)))
                        value = Convert.ToByte(value);
                    else if ((property.PropertyType == typeof(System.Boolean)) || (property.PropertyType == typeof(System.Boolean?)))
                        value = BoolParseEX(value as string);
                    else if ((property.PropertyType == typeof(System.Char)) || (property.PropertyType == typeof(System.Char?)))
                        value = Convert.ToChar(value);
                    else if ((property.PropertyType == typeof(System.Decimal)) || (property.PropertyType == typeof(System.Decimal?)))
                        value = Convert.ToDecimal(value);
                    else if ((property.PropertyType == typeof(System.Double)) || (property.PropertyType == typeof(System.Double?)))
                        value = Convert.ToDouble(value);
                    else if ((property.PropertyType == typeof(string))) // || (property.PropertyType == typeof(string?)))
                        value = Convert.ToString(value);
                    else
                        throw new Exception(string.Format("value type not support!!   {0}", property.PropertyType.FullName));
 
                    try
                    {
                        property.SetValue(target, value, null);
                    }
                    catch
                    {
                        //ignore
                    }
                }
            }
            return form;
        }


因為 c# 2.0 加入了 Nullable 的原故,所以特別要做 Nullable 的判斷

2008年12月22日 星期一

Linq to Entity Problem


var query = DataEntities.CLD_CLASSDEF.Where(p => p.ID == new Guid(form["ID"])).FirstOrDefault();


會造成 Only parameterless constructors and initializers are supported in LINQ to Entities

解法為

var query = (from p in dataContext.CLD_CLASSDEF
where p.ID.CompareTo(cldDetailID) == 0
select p).FirstOrDefault();


原因 ??

我也不知道

下面這兩篇好像有討論到,有時間再看

http://mosesofegypt.net/post/2008/08/24/LINQ-to-Entities-what-is-not-supported.aspx
http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/9dee0d13-490c-48aa-bad5-50768d3cedf1/

2008年12月12日 星期五

Generic Type Casting

class c1
{
public Department Department{get;set;}
}

class c2:c1
{
public new Department Department{get;set;}
}

class Department
{
}

class Department : Department
{
}


在這個狀況下 Department 該如何轉型呢??


public new Department Department
{
get
{
Object temp = base.Department;
return temp as Department;
}
set { }
}