Beispiel #1
0
        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);
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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);
        }