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"); }
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))); } }
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)); }
private bool IsNotifyValue(Type actual, Type spec) { return(ReflectionHelper.IsAssignableFrom(typeof(INotifyValue <>).MakeGenericType(spec), actual)); }