C#仿BeanUtils的部份功能

public class BeanUtils
{
    public static void CopyProperties(object pobSrc, object pobDest, OptionTyp penOpt)
    {
        SetProperties(GetProperties(pobSrc), pobDest, penOpt);
    }

    public static void CopyPropertiesWithMap(object pobSrc, object pobDest, Dictionary<string, string> pdiMap, OptionTyp penOpt)
    {
        List<string> strSrc = new List<string>();
        List<string> strDest = new List<string>();
        foreach (KeyValuePair<string, string> pair in pdiMap)
        {
            strSrc.Add(pair.Key);
            strDest.Add(pair.Value);
        }
        CopyPropertiesWithMap(pobSrc, pobDest, strSrc.ToArray(), strDest.ToArray(), penOpt);
    }

    public static void CopyPropertiesWithMap(object pobSrc, object pobDest, string[] pstSrcPropertyNames, string[] pstDestPropertyNames, OptionTyp penOpt)
    {
        if (null == pobSrc || null == pobDest)
        { throw new ArgumentNullException("one of the arguments is null!"); }

        if (pstDestPropertyNames.Length != pstSrcPropertyNames.Length)
            throw new ArgumentException("pstDestPropertyNames & pstSrcPropertyNames must have same length");

        for (int i = 0; i < pstDestPropertyNames.Length; i++)
        {
            CopyProperty(pobSrc, pobDest, pstSrcPropertyNames[i], pstDestPropertyNames[i], penOpt);
        }
    }

    public static T GenernationObject<T>(object pobSrc, OptionTyp penOpt)
    {
        T lobDest = Activator.CreateInstance<T>();
        CopyProperties(pobSrc, lobDest, penOpt);
        return lobDest;
    }

    public static T GenernationObject<T>(Dictionary<string, object> pdiProperties, OptionTyp penOpt)
    {
        T lobDest = Activator.CreateInstance<T>();
        SetProperties(pdiProperties, lobDest, penOpt);

        return lobDest;
    }

    public static Dictionary<string, object> GetProperties(object pobObj)
    {
        Dictionary<string, object> list = new Dictionary<string, object>();
        string name;
        object val;

        if (null == pobObj) { throw new ArgumentNullException("pobObj can't be null"); }

        Type objType = pobObj.GetType();

        PropertyInfo[] objInfo = objType.GetProperties(BindingFlags.Instance | BindingFlags.Public);

        for (int i = 0; i < objInfo.Length; i++)
        {
            name = objInfo[i].Name;
            val = objInfo[i].GetValue(pobObj, null);

            list.Add(name, val);
        }
        return list;
    }

    public static void SetProperties(Dictionary<string, object> pdiProperties, object pobObj, OptionTyp penOpt)
    {
        foreach (KeyValuePair<string, object> pair in pdiProperties)
        {
            try
            {
                SetProperty(pobObj, pair.Key, pair.Value, penOpt);
            }
            catch (MapPropertyException) { }
        }
    }

    public static void CopyProperty(object pobSrc, object pobDest, string pstPropertyName, OptionTyp penOpt)
    {
        CopyProperty(pobSrc, pobDest, pstPropertyName, pstPropertyName, penOpt);
    }

    public static void CopyProperty(object pobSrc, object pobDest, string pstSrcPropertyName, string pstDestPropertyName, OptionTyp penOpt)
    {
        SetProperty(pobDest, pstDestPropertyName, GetProperty(pobSrc, pstSrcPropertyName, penOpt), penOpt);
    }

    public static void SetProperty(object pobObj, string pstPropertyName, object pobValue, OptionTyp penOpt)
    {
        if (null == pobObj || string.IsNullOrEmpty(pstPropertyName))
        {
            throw new ArgumentNullException("one of the arguments is null!");
        }

        bool isIgnoreCase = ((penOpt & OptionTyp.IsIgnoreCase) == OptionTyp.IsIgnoreCase);
        bool isConvert = ((penOpt & OptionTyp.IsConvert) == OptionTyp.IsConvert);
        bool isThrowConvertException = ((penOpt & OptionTyp.IsThrowConvertException) == OptionTyp.IsThrowConvertException);

        Type t = pobObj.GetType();
        PropertyInfo objInfo = null;
        if (isIgnoreCase)
        {
            PropertyInfo[] objInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public);
            foreach (PropertyInfo p in objInfos)
            {
                if (p.Name.ToUpperInvariant().Equals(pstPropertyName.ToUpperInvariant()))
                {
                    objInfo = p;
                    break;
                }
            }
        }
        else
            objInfo = t.GetProperty(pstPropertyName, BindingFlags.Instance | BindingFlags.Public);

        if (null == objInfo)
            throw new MapPropertyException("none mapping property");

        object descVal = null;
        if (null == pobValue || !isConvert)
            descVal = pobValue;
        else
            descVal = GetDestValue(pobValue.GetType(), objInfo.PropertyType, pobValue, isThrowConvertException);
        objInfo.SetValue(pobObj, descVal, null);
    }

    public static object GetProperty(object pobObj, string pstPropertyName, OptionTyp penOpt)
    {
        if (null == pobObj || string.IsNullOrEmpty(pstPropertyName))
        {
            throw new ArgumentNullException("Argument can't be null!");
        }
        bool isIgnoreCase = ((penOpt & OptionTyp.IsIgnoreCase) == OptionTyp.IsIgnoreCase);
        Type t = pobObj.GetType();
        PropertyInfo objInfo = null;
        if (isIgnoreCase)
        {
            PropertyInfo[] objInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public);
            foreach (PropertyInfo p in objInfos)
            {
                if (p.Name.ToUpperInvariant().Equals(pstPropertyName.ToUpperInvariant()))
                {
                    objInfo = p;
                    break;
                }
            }
        }
        else
            objInfo = t.GetProperty(pstPropertyName, BindingFlags.Instance | BindingFlags.Public);

        if (null == objInfo)
            throw new MapPropertyException("none mapping property");

        object val = objInfo.GetValue(pobObj, null);
        return val;
    }
}

[Flags, Serializable]
public enum OptionTyp
{
    None = 0,
    IsIgnoreCase = 0x0001,
    IsConvert = 0x0002,
    IsThrowConvertException = 0x0004
}

public class MapPropertyException : Exception
{
    public MapPropertyException(string message) : base(message) { }
}

public class ConvertException : Exception
{
    public ConvertException(string message) : base(message) { }
}
posted @ 2009-06-19 09:28  他山之石_  阅读(2166)  评论(2编辑  收藏  举报