C#BeanUtilsの一部の機能を模倣
6735 ワード
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) { }
}