コード例 #1
0
ファイル: ReflectionHelper.cs プロジェクト: lukeIam/NMF
        internal static MethodInfo GetRemoveMethod(Type collectionType, Type elementType)
        {
            var collectionTypeInfo = collectionType.GetTypeInfo();
            var elementTypeInfo    = elementType.GetTypeInfo();

            if (ReflectionHelper.IsAssignableFrom(typeof(IList), collectionType))
            {
                var map = collectionTypeInfo.GetRuntimeInterfaceMap(typeof(IList));
                return(map.TargetMethods[9]);
            }
            var methods = collectionType.GetRuntimeMethods();

            foreach (var method in methods)
            {
                if (method.Name == "Remove")
                {
                    var parameters = method.GetParameters();
                    if (parameters != null && parameters.Length == 1)
                    {
                        if (!parameters[0].IsOut && parameters[0].ParameterType.GetTypeInfo().IsAssignableFrom(elementTypeInfo))
                        {
                            return(method);
                        }
                    }
                }
            }
            throw new InvalidOperationException("No suitable Remove method found");
        }
コード例 #2
0
 protected override Expression VisitMember(MemberExpression node)
 {
     if (ReflectionHelper.IsAssignableFrom(node.Type, Value.Type))
     {
         return(Expression.Assign(node, Value));
     }
     else
     {
         return(Expression.Assign(node, Expression.Convert(Value, node.Type)));
     }
 }
コード例 #3
0
        private static ObservableMemberBinding <T> CreateProperty <T, TMember>(MemberAssignment node, ObservableExpressionBinder binder, INotifyExpression <T> target)
        {
            INotifyExpression <TMember> value = binder.VisitObservable <TMember>(node.Expression);
            var property   = node.Member as PropertyInfo;
            var reversable = value as INotifyReversableExpression <TMember>;

            if (reversable != null && ReflectionHelper.IsAssignableFrom(typeof(INotifyPropertyChanged), typeof(T)))
            {
                return(new ObservableReversablePropertyMemberBinding <T, TMember>(target, node.Member.Name,
                                                                                  ReflectionHelper.CreateDelegate(typeof(Func <T, TMember>), ReflectionHelper.GetGetter(property)) as Func <T, TMember>,
                                                                                  ReflectionHelper.CreateDelegate(typeof(Action <T, TMember>), ReflectionHelper.GetSetter(property)) as Action <T, TMember>,
                                                                                  reversable));
            }
            return(new ObservablePropertyMemberBinding <T, TMember>(target,
                                                                    ReflectionHelper.CreateDelegate(typeof(Action <T, TMember>), ReflectionHelper.GetSetter(property)) as Action <T, TMember>, value));
        }
コード例 #4
0
 private bool IsNotifyValue(Type actual, Type spec)
 {
     return(ReflectionHelper.IsAssignableFrom(typeof(INotifyValue <>).MakeGenericType(spec), actual));
 }