/**/
/// <summary> 较安全的返回指定属性的值 </summary>
/// <remarks>
/// 例如,如果你想获得Company的CompanyCode的DefaultCode属性,可以使用
/// <code>
/// object code = _company.SafeGetValue("CompanyCode.DefaultCode");
/// </code>
/// 但注意:
/// 传入的参数(属性名)不允许书写错误,在此方法中不对此进行检查;
/// </remarks>
public object SafeGetValue( string propertyName)
{
string[] props = propertyName.Split('.');
string propName;
PropertyInfo propInfo;
object obj = this;
Type objType;
for (int i = 0; i < props.Length; i++)
{
objType = obj.GetType();
propName = props[i];
if (propName.Trim().Length == 0)
throw new ArgumentException("propertyName");
try
{
propInfo = objType.GetProperty(propName);
if (propInfo == null)
throw new ArgumentException("propertyName");
obj = propInfo.GetValue(obj, null);
}
catch (AmbiguousMatchException)
{
PropertyDescriptorCollection propDescs = TypeDescriptor.GetProperties(objType);
PropertyDescriptor propDesc = propDescs.Find(propName, false);
if (propDesc == null)
throw new ArgumentException("propertyName");
else
{
obj = propDesc.GetValue(obj);
}
}
if (obj == null)
return null;
}
return obj;
}
/// <remarks>
/// 例如,如果你想获得Company的CompanyCode的DefaultCode属性,可以使用
/// <code>
/// object code = _company.SafeGetValue("CompanyCode.DefaultCode");
/// </code>
/// 但注意:
/// 传入的参数(属性名)不允许书写错误,在此方法中不对此进行检查;
/// </remarks>
public object SafeGetValue( string propertyName)
{
string[] props = propertyName.Split('.');
string propName;
PropertyInfo propInfo;
object obj = this;
Type objType;
for (int i = 0; i < props.Length; i++)
{
objType = obj.GetType();
propName = props[i];
if (propName.Trim().Length == 0)
throw new ArgumentException("propertyName");
try
{
propInfo = objType.GetProperty(propName);
if (propInfo == null)
throw new ArgumentException("propertyName");
obj = propInfo.GetValue(obj, null);
}
catch (AmbiguousMatchException)
{
PropertyDescriptorCollection propDescs = TypeDescriptor.GetProperties(objType);
PropertyDescriptor propDesc = propDescs.Find(propName, false);
if (propDesc == null)
throw new ArgumentException("propertyName");
else
{
obj = propDesc.GetValue(obj);
}
}
if (obj == null)
return null;
}
return obj;
}