protected virtual MvxChainedSourceBinding CreateChainedBinding(object source, MvxPropertyToken propertyToken, List<MvxPropertyToken> remainingTokens) { var indexPropertyToken = propertyToken as MvxIndexerPropertyToken; if (indexPropertyToken != null) { var itemPropertyInfo = this.FindPropertyInfo(source); if (itemPropertyInfo == null) return null; return new MvxIndexerChainedSourceBinding(source, itemPropertyInfo, indexPropertyToken, remainingTokens); } var propertyNameToken = propertyToken as MvxPropertyNamePropertyToken; if (propertyNameToken != null) { var propertyInfo = this.FindPropertyInfo(source, propertyNameToken.PropertyName); if (propertyInfo == null) return null; return new MvxSimpleChainedSourceBinding(source, propertyInfo, remainingTokens); } throw new MvxException("Unexpected property chaining - seen token type {0}", propertyToken.GetType().FullName); }
public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { if (source == null) { result = null; return(false); } var propertyNameToken = currentToken as MvxPropertyNamePropertyToken; if (propertyNameToken == null) { result = null; return(false); } var fieldInfo = FindFieldInfo(source, propertyNameToken.PropertyName); if (fieldInfo == null) { result = null; return(false); } if (typeof(INotifyChange).IsAssignableFrom(fieldInfo.FieldType)) { return(TryCreateNotifyChangeBinding(source, remainingTokens, out result, fieldInfo, propertyNameToken)); } return(TryCreateFieldInfoBinding(source, remainingTokens, out result, fieldInfo)); }
protected virtual IMvxSourceBinding CreateLeafBinding(object source, MvxPropertyToken propertyToken) { var indexPropertyToken = propertyToken as MvxIndexerPropertyToken; if (indexPropertyToken != null) { var itemPropertyInfo = this.FindPropertyInfo(source); if (itemPropertyInfo == null) return null; return new MvxIndexerLeafPropertyInfoSourceBinding(source, itemPropertyInfo, indexPropertyToken); } var propertyNameToken = propertyToken as MvxPropertyNamePropertyToken; if (propertyNameToken != null) { var propertyInfo = this.FindPropertyInfo(source, propertyNameToken.PropertyName); if (propertyInfo == null) return null; return new MvxSimpleLeafPropertyInfoSourceBinding(source, propertyInfo); } if (propertyToken is MvxEmptyPropertyToken) { return new MvxDirectToSourceBinding(source); } throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName); }
protected virtual IMvxSourceBinding CreateLeafBinding(object source, MvxPropertyToken propertyToken) { var indexPropertyToken = propertyToken as MvxIndexerPropertyToken; if (indexPropertyToken != null) { var itemPropertyInfo = FindPropertyInfo(source); if (itemPropertyInfo == null) { return(null); } return(new MvxIndexerLeafPropertyInfoSourceBinding(source, itemPropertyInfo, indexPropertyToken)); } var propertyNameToken = propertyToken as MvxPropertyNamePropertyToken; if (propertyNameToken != null) { var propertyInfo = FindPropertyInfo(source, propertyNameToken.PropertyName); if (propertyInfo == null) { return(null); } return(new MvxSimpleLeafPropertyInfoSourceBinding(source, propertyInfo)); } if (propertyToken is MvxEmptyPropertyToken) { return(new MvxDirectToSourceBinding(source)); } throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName); }
public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { if (source == null) { result = null; return false; } var propertyNameToken = currentToken as MvxPropertyNamePropertyToken; if (propertyNameToken == null) { result = null; return false; } var fieldInfo = FindFieldInfo(source, propertyNameToken.PropertyName); if (fieldInfo == null) { result = null; return false; } if (typeof (INotifyChange).IsAssignableFrom(fieldInfo.FieldType)) { return TryCreateNotifyChangeBinding(source, remainingTokens, out result, fieldInfo, propertyNameToken); } return TryCreateFieldInfoBinding(source, remainingTokens, out result, fieldInfo); }
public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { if (source == null) { result = null; return(false); } result = remainingTokens.Count == 0 ? CreateLeafBinding(source, currentToken) : CreateChainedBinding(source, currentToken, remainingTokens); return(result != null); }
public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { if (source == null) { result = null; return false; } result = remainingTokens.Count == 0 ? this.CreateLeafBinding(source, currentToken) : this.CreateChainedBinding(source, currentToken, remainingTokens); return result != null; }
protected bool TryCreateBindingFromExtensions(object source, MvxPropertyToken propertyToken, List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { foreach (var extension in _extensions) { if (extension.TryCreateBinding(source, propertyToken, remainingTokens, out result)) { return(true); } } result = null; return(false); }
protected bool TryCreateBindingFromExtensions(object source, MvxPropertyToken propertyToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { foreach (var extension in _extensions) { if (extension.TryCreateBinding(source, propertyToken, remainingTokens, out result)) { return true; } } result = null; return false; }
private static MvxChainedSourceBinding CreateChainedBinding(object source, MvxPropertyToken propertyToken, List<MvxPropertyToken> remainingTokens) { if (propertyToken is MvxIndexerPropertyToken) { return new MvxIndexerChainedSourceBinding(source, (MvxIndexerPropertyToken) propertyToken, remainingTokens); } else if (propertyToken is MvxPropertyNamePropertyToken) { return new MvxSimpleChainedSourceBinding(source, (MvxPropertyNamePropertyToken) propertyToken, remainingTokens); } throw new MvxException("Unexpected property chaining - seen token type {0}", propertyToken.GetType().FullName); }
private static MvxChainedSourceBinding CreateChainedBinding(object source, MvxPropertyToken propertyToken, List <MvxPropertyToken> remainingTokens) { if (propertyToken is MvxIndexerPropertyToken) { return(new MvxIndexerChainedSourceBinding(source, (MvxIndexerPropertyToken)propertyToken, remainingTokens)); } else if (propertyToken is MvxPropertyNamePropertyToken) { return(new MvxSimpleChainedSourceBinding(source, (MvxPropertyNamePropertyToken)propertyToken, remainingTokens)); } throw new MvxException("Unexpected property chaining - seen token type {0}", propertyToken.GetType().FullName); }
private static IMvxSourceBinding CreateLeafBinding(object source, MvxPropertyToken propertyToken) { if (propertyToken is MvxIndexerPropertyToken) { return new MvxIndexerLeafPropertyInfoSourceBinding(source, (MvxIndexerPropertyToken) propertyToken); } else if (propertyToken is MvxPropertyNamePropertyToken) { return new MvxSimpleLeafPropertyInfoSourceBinding(source, (MvxPropertyNamePropertyToken) propertyToken); } else if (propertyToken is MvxEmptyPropertyToken) { return new MvxDirectToSourceBinding(source); } throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName); }
private static IMvxSourceBinding CreateLeafBinding(object source, MvxPropertyToken propertyToken) { if (propertyToken is MvxIndexerPropertyToken) { return(new MvxIndexerLeafPropertyInfoSourceBinding(source, (MvxIndexerPropertyToken)propertyToken)); } else if (propertyToken is MvxPropertyNamePropertyToken) { return(new MvxSimpleLeafPropertyInfoSourceBinding(source, (MvxPropertyNamePropertyToken)propertyToken)); } else if (propertyToken is MvxEmptyPropertyToken) { return(new MvxDirectToSourceBinding(source)); } throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName); }
public bool TryCreateBinding(object source, MvxPropertyToken propertyToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { var observable = source as IObservable<object>; if (observable != null) { var list = new List<MvxPropertyToken>(); if (!(propertyToken is MvxEmptyPropertyToken)) list.Add(propertyToken); list.AddRange(remainingTokens); result = new ObservableMvxSourceBinding(observable, list); return true; } result = null; return false; }
public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { if (source == null) { result = null; return(false); } if (remainingTokens.Count > 0) { result = null; return(false); } var propertyNameToken = currentToken as MvxPropertyNamePropertyToken; if (propertyNameToken == null) { result = null; return(false); } var methodInfo = FindMethodInfo(source, propertyNameToken.PropertyName); if (methodInfo == null) { result = null; return(false); } var parameters = methodInfo.GetParameters(); if (parameters.Count(p => !p.IsOptional) > 1) { MvxPluginLog.Instance?.Log(LogLevel.Warning, "Problem binding to Method {0} - too many non-optional parameters"); } result = new MvxMethodSourceBinding(source, methodInfo); return(true); }
public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { if (source == null) { result = null; return false; } if (remainingTokens.Count > 0) { result = null; return false; } var propertyNameToken = currentToken as MvxPropertyNamePropertyToken; if (propertyNameToken == null) { result = null; return false; } var methodInfo = FindMethodInfo(source, propertyNameToken.PropertyName); if (methodInfo == null) { result = null; return false; } var parameters = methodInfo.GetParameters(); if (parameters.Count(p => !p.IsOptional) > 1) { MvxBindingTrace.Warning("Problem binding to Method {0} - too many non-optional parameters"); } result = new MvxMethodSourceBinding(source, methodInfo); return true; }
public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { if (source != null) { Type bindingSourceType = null; Type bindingTypeParameter = null; if (currentToken is MvxEmptyPropertyToken) { var observable = source as IObservable <object>; if (observable != null) { result = new ObservableMvxSourceBinding <object>(observable, typeof(object), this._mainThreadDispatcher, remainingTokens); return(true); } var implementedInterface = source .GetType() .GetTypeInfo() .ImplementedInterfaces .FirstOrDefault(iface => ((iface.IsConstructedGenericType) && (iface.GetGenericTypeDefinition() == typeof(IObservable <>)))); if (implementedInterface != null) { bindingSourceType = bindingTypeParameter = implementedInterface.GenericTypeArguments[0]; } } else { var propertyNameToken = currentToken as MvxPropertyNamePropertyToken; if (propertyNameToken != null) { var propertyInfo = this.FindPropertyInfo(source, propertyNameToken.PropertyName); if (propertyInfo != null) { var propertyTypeInfo = propertyInfo.PropertyType.GetTypeInfo(); if ((propertyTypeInfo.IsGenericType) && (propertyTypeInfo.GetGenericTypeDefinition() == typeof(IObservable <>))) { source = propertyInfo.GetValue(source, ObservableMvxPropertySourceBindingFactoryExtension.EmptyObjectArray); if (source != null) { bindingSourceType = propertyTypeInfo.GenericTypeArguments[0]; bindingTypeParameter = (bindingSourceType.GetTypeInfo().IsValueType) ? bindingSourceType : typeof(object); } } } } } if (bindingTypeParameter != null) { result = (IMvxSourceBinding)Activator.CreateInstance( typeof(ObservableMvxSourceBinding <>).MakeGenericType(bindingTypeParameter), source, bindingSourceType, this._mainThreadDispatcher, remainingTokens); return(true); } } result = null; return(false); }
public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result) { if (source != null) { Type bindingSourceType = null; Type bindingTypeParameter = null; if (currentToken is MvxEmptyPropertyToken) { var observable = source as IObservable<object>; if (observable != null) { result = new ObservableMvxSourceBinding<object>(observable, typeof(object), this._mainThreadDispatcher, remainingTokens); return true; } var implementedInterface = source .GetType() .GetTypeInfo() .ImplementedInterfaces .FirstOrDefault(iface => ((iface.IsConstructedGenericType) && (iface.GetGenericTypeDefinition() == typeof(IObservable<>)))); if (implementedInterface != null) bindingSourceType = bindingTypeParameter = implementedInterface.GenericTypeArguments[0]; } else { var propertyNameToken = currentToken as MvxPropertyNamePropertyToken; if (propertyNameToken != null) { var propertyInfo = this.FindPropertyInfo(source, propertyNameToken.PropertyName); if (propertyInfo != null) { var propertyTypeInfo = propertyInfo.PropertyType.GetTypeInfo(); if ((propertyTypeInfo.IsGenericType) && (propertyTypeInfo.GetGenericTypeDefinition() == typeof(IObservable<>))) { source = propertyInfo.GetValue(source, ObservableMvxPropertySourceBindingFactoryExtension.EmptyObjectArray); if (source != null) { bindingSourceType = propertyTypeInfo.GenericTypeArguments[0]; bindingTypeParameter = (bindingSourceType.GetTypeInfo().IsValueType) ? bindingSourceType : typeof(object); } } } } } if (bindingTypeParameter != null) { result = (IMvxSourceBinding)Activator.CreateInstance( typeof(ObservableMvxSourceBinding<>).MakeGenericType(bindingTypeParameter), source, bindingSourceType, this._mainThreadDispatcher, remainingTokens); return true; } } result = null; return false; }
private static void AssertIsSimplePropertyToken(MvxPropertyToken token, string text) { Assert.IsInstanceOf <MvxPropertyNamePropertyToken>(token); Assert.AreEqual(text, ((MvxPropertyNamePropertyToken)token).PropertyName); }
private static void AssertIsIndexerPropertyToken <T, TSpecific>(MvxPropertyToken token, T value) { Assert.IsInstanceOf <MvxIndexerPropertyToken <T> >(token); Assert.IsInstanceOf <TSpecific>(token); Assert.AreEqual(value, ((MvxIndexerPropertyToken <T>)token).Key); }
protected virtual MvxChainedSourceBinding CreateChainedBinding(object source, MvxPropertyToken propertyToken, List <MvxPropertyToken> remainingTokens) { var indexPropertyToken = propertyToken as MvxIndexerPropertyToken; if (indexPropertyToken != null) { var itemPropertyInfo = FindPropertyInfo(source); if (itemPropertyInfo == null) { return(null); } return(new MvxIndexerChainedSourceBinding(source, itemPropertyInfo, indexPropertyToken, remainingTokens)); } var propertyNameToken = propertyToken as MvxPropertyNamePropertyToken; if (propertyNameToken != null) { var propertyInfo = FindPropertyInfo(source, propertyNameToken.PropertyName); if (propertyInfo == null) { return(null); } return(new MvxSimpleChainedSourceBinding(source, propertyInfo, remainingTokens)); } throw new MvxException("Unexpected property chaining - seen token type {0}", propertyToken.GetType().FullName); }
private static void AssertIsSimplePropertyToken(MvxPropertyToken token, string text) { Assert.IsAssignableFrom <MvxPropertyNamePropertyToken>(token); Assert.Equal(text, ((MvxPropertyNamePropertyToken)token).PropertyName); }
private static void AssertIsIndexerPropertyToken <T, TSpecific>(MvxPropertyToken token, T value) { Assert.IsAssignableFrom <MvxIndexerPropertyToken <T> >(token); Assert.IsAssignableFrom <TSpecific>(token); Assert.Equal(value, ((MvxIndexerPropertyToken <T>)token).Key); }