public bool TryGetValue(string propertyName, out object value, out Type type) { type = typeof(object); if (_dic.TryGetValue(propertyName, out value)) { if (value == null) { return(true); } type = value.GetType(); return(true); } if (_objects.Count == 0) { return(false); } foreach (object dataObject in _objects) { MemberInfo member = GetMember(dataObject.GetType(), propertyName); if (member == null) { continue; } if (member is PropertyInfo) { value = ((PropertyInfo)member).GetValue(dataObject, null); type = ((PropertyInfo)member).PropertyType; return(true); } if (member is FieldInfo) { value = ((FieldInfo)member).GetValue(dataObject); type = ((FieldInfo)member).FieldType; return(true); } if (member is MethodInfo) { value = new InstanceMethod(dataObject.GetType(), propertyName, dataObject); type = typeof(InstanceMethod); return(true); } } return(false); }
public static bool TryGetValue(object obj, string propertyName, out object value, out Type type) { value = null; type = typeof(object); if (obj is IDynamicObject) return ((IDynamicObject) obj).TryGetValue(propertyName, out value, out type); Type targetType = obj.GetType(); MemberInfo[] members = targetType.Inspector().GetMember(propertyName); if (members.Length == 0) { PropertyInfo indexerPropInfo = targetType.Inspector().GetIndexer(new[] { typeof(string) }); if (indexerPropInfo != null) { value = indexerPropInfo.GetValue(obj, new object[] { propertyName }); type = (value != null && indexerPropInfo.PropertyType == typeof(object)) ? value.GetType() : typeof(object); return true; } return false; } if (members.Length >= 1 && members[0] is MethodInfo) { value = new InstanceMethod(targetType, propertyName, obj); type = typeof(InstanceMethod); return true; } MemberInfo member = members[0]; if (members.Length > 1) // CoolStorage, ActiveRecord and Dynamic Proxy frameworks sometimes return > 1 member { foreach (MemberInfo mi in members) if (mi.DeclaringType == obj.GetType()) member = mi; } if (member is FieldInfo) { value = ((FieldInfo)member).GetValue(obj); type = ((FieldInfo)member).FieldType; return true; } if (member is PropertyInfo) { value = ((PropertyInfo)member).GetValue(obj, null); type = ((PropertyInfo)member).PropertyType; return true; } return false; }
public static bool TryGetValue(object obj, string propertyName, out object value, out Type type) { value = null; type = typeof(object); if (obj is IDynamicObject) { return(((IDynamicObject)obj).TryGetValue(propertyName, out value, out type)); } Type targetType = obj.GetType(); MemberInfo[] members = targetType.Inspector().GetMember(propertyName); if (members.Length == 0) { PropertyInfo indexerPropInfo = targetType.Inspector().GetIndexer(new[] { typeof(string) }); if (indexerPropInfo != null) { value = indexerPropInfo.GetValue(obj, new object[] { propertyName }); type = (value != null && indexerPropInfo.PropertyType == typeof(object)) ? value.GetType() : typeof(object); return(true); } return(false); } if (members.Length >= 1 && members[0] is MethodInfo) { value = new InstanceMethod(targetType, propertyName, obj); type = typeof(InstanceMethod); return(true); } MemberInfo member = members[0]; if (members.Length > 1) // CoolStorage, ActiveRecord and Dynamic Proxy frameworks sometimes return > 1 member { foreach (MemberInfo mi in members) { if (mi.DeclaringType == obj.GetType()) { member = mi; } } } if (member is FieldInfo) { value = ((FieldInfo)member).GetValue(obj); type = ((FieldInfo)member).FieldType; return(true); } if (member is PropertyInfo) { value = ((PropertyInfo)member).GetValue(obj, null); type = ((PropertyInfo)member).PropertyType; return(true); } return(false); }