Ejemplo n.º 1
0
        public static TValue GetFieldValue <TValue>(
            [NotNull] this IntrospectiveContext @this,
            [NotNull] MemberDescriptor memberDescriptor,
            [NotNull] string fieldName)
        {
            @this.IsNotNull(nameof(@this));
            memberDescriptor.IsNotNull(nameof(memberDescriptor));
            fieldName.IsNotNull(nameof(fieldName));

            var ownerType = @this.TargetType;
            var fieldInfo = ownerType.GetField(fieldName, memberDescriptor);

            if (fieldInfo == null)
            {
                throw new MissingMemberException(ownerType.Name, nameof(fieldName));
            }


            var fieldType = fieldInfo.FieldType;
            var valueType = typeof(TValue);

            var rawValue = fieldInfo.GetValue(@this.TargetObject);

            return((TValue)rawValue);

            //if (!fieldType.IsAssignableFrom(valueType))
            //var adjustedValue = value;
            //throw new InvalidCastException($"Cannot cast property value \'{returnVal.GetType().Name}\' to {typeof(TResult).Name}");
        }
Ejemplo n.º 2
0
        public static TReturns InvokeMethod <TReturns>(
            [NotNull] this IntrospectiveContext @this,
            [NotNull] MemberDescriptor memberDescriptor,
            [NotNull] string methodName,
            params object[] methodArgs)
        {
            @this.IsNotNull(nameof(@this));
            memberDescriptor.IsNotNull(nameof(memberDescriptor));
            methodName.IsNotNull(nameof(methodName));

            var ownerType  = @this.TargetType;
            var methodInfo = ownerType.GetMethod(methodName, memberDescriptor);

            if (methodInfo == null)
            {
                throw new MissingMethodException(
                          ownerType.Name,
                          methodName);
            }

            var rawReturnValue = methodInfo.Invoke(
                @this.TargetObject,
                methodArgs);

            if (rawReturnValue is TReturns)
            {
                return((TReturns)rawReturnValue);
            }
            throw new InvalidCastException(
                      $"Cannot cast raw returned value of type \'{rawReturnValue.GetType().FormatName()}\' " +
                      $"to the expected return type of \'{typeof(TReturns).FormatName()}\'.");
        }
Ejemplo n.º 3
0
 public static object GetFieldValue(
     [NotNull] this IntrospectiveContext @this,
     [NotNull] MemberDescriptor memberDescriptor,
     [NotNull] string fieldName)
 {
     return(@this.GetFieldValue <object>(
                memberDescriptor,
                fieldName));
 }
Ejemplo n.º 4
0
        public static TReturns InvokeMethodGeneric <TReturns>(
            [NotNull] this IntrospectiveContext @this,
            [NotNull] MemberDescriptor memberDescriptor,
            [NotNull] string methodName,
            Type[] genericTypeArgs,
            object[] methodArgs)
        {
            @this.IsNotNull(nameof(@this));
            memberDescriptor.IsNotNull(nameof(memberDescriptor));
            methodName.IsNotNull(nameof(methodName));

            var ownerType  = @this.TargetType;
            var methodInfo = ownerType.GetMethod(methodName, memberDescriptor);

            if (methodInfo == null)
            {
                throw new MissingMethodException(
                          ownerType.Name,
                          methodName);
            }

            var genericMethodInfo = methodInfo.MakeGenericMethod(genericTypeArgs);

            if (genericMethodInfo == null)
            {
                throw new ArgumentException(
                          $"Unable to create a generic method from the provided " +
                          $"generic type arguments: <" +
                          string.Join(", ",
                                      genericTypeArgs
                                      .Select(
                                          t => t.FormatName())
                                      .ToArray()) + ">.",
                          new MissingMethodException(
                              ownerType.Name,
                              methodName));
            }

            var rawReturnValue = genericMethodInfo.Invoke(
                @this.TargetObject,
                methodArgs);

            if (rawReturnValue is TReturns)
            {
                return((TReturns)rawReturnValue);
            }
            throw new InvalidCastException(
                      $"Cannot cast raw returned value of type \'{rawReturnValue.GetType().FormatName()}\' " +
                      $"to the expected return type of \'{typeof(TReturns).FormatName()}\'.");
        }
Ejemplo n.º 5
0
        public static void SetFieldValue <TValue>(
            [NotNull] this IntrospectiveContext @this,
            [NotNull] MemberDescriptor memberDescriptor,
            [NotNull] string fieldName,
            [CanBeNull] TValue value)
        {
            @this.IsNotNull(nameof(@this));
            memberDescriptor.IsNotNull(nameof(memberDescriptor));
            fieldName.IsNotNull(nameof(fieldName));

            var ownerType = @this.GetType();
            var fieldInfo = ownerType.GetField(fieldName, memberDescriptor);

            if (fieldInfo == null)
            {
                throw new MissingMemberException(ownerType.Name, nameof(fieldName));
            }


            var fieldType = fieldInfo.FieldType;
            var valueType = typeof(TValue);

            if (value != null && !valueType.IsValueType)
            {
                var defaultValue = valueType.GetDefaultValue();
            }
            if (value == null || value.GetType().IsValueType)
            {
                fieldInfo.SetValue(@this, null);
            }
            fieldInfo.SetValue(@this, value);

            //if (!fieldType.IsAssignableFrom(valueType))
            //var adjustedValue = value;
            //throw new InvalidCastException($"Cannot cast property value \'{returnVal.GetType().Name}\' to {typeof(TResult).Name}");
        }
Ejemplo n.º 6
0
        public static void InvokeMethod(
            [NotNull] this IntrospectiveContext @this,
            [NotNull] MemberDescriptor memberDescriptor,
            [NotNull] string methodName,
            params object[] methodArgs)
        {
            @this.IsNotNull(nameof(@this));
            memberDescriptor.IsNotNull(nameof(memberDescriptor));
            methodName.IsNotNull(nameof(methodName));

            var ownerType  = @this.TargetType;
            var methodInfo = ownerType.GetMethod(methodName, memberDescriptor);

            if (methodInfo == null)
            {
                throw new MissingMethodException(
                          ownerType.Name,
                          methodName);
            }

            methodInfo.Invoke(
                @this.TargetObject,
                methodArgs);
        }