static void ResolveRefOutArgs(AppFriend app, Type type, object src, out object arg, out ResolveArgument resolveArgument) { if (type.IsInterface) { ResolveInterfaceRefOutArgs(app, type, src, out arg, out resolveArgument); } else if (type == typeof(AppVar)) { ResolveAppVarRefOutArgs(app, type, src, out arg, out resolveArgument); } else { var func = UserWrapperUtility.FindCreateConstructor(type); if (func != null) { ResolveUserWrapperRefOutArgs(func, app, src, out arg, out resolveArgument); } else { AppVar appVar = app.Dim(src); arg = appVar; resolveArgument = () => appVar.Core; } } }
static void ResolveInterfaceRefOutArgs(AppFriend app, Type type, object src, out object arg, out ResolveArgument resolveArgument) { if (src == null) { AppVar appVar = app.Dim(); arg = appVar; resolveArgument = () => FriendlyProxyFactory.WrapFriendlyProxyInstance(type, appVar); } else { var proxy = RemotingServices.GetRealProxy(src) as IAppVarOwner; if (proxy == null) { AppVar appVar = app.Dim(src); arg = appVar; resolveArgument = () => FriendlyProxyFactory.WrapFriendlyProxyInstance(type, appVar); } else { arg = proxy; resolveArgument = () => AppVarUtility.IsNull(proxy.AppVar) ? null : src; } } }
static void ResolveUserWrapperRefOutArgs(UserWrapperUtility.Construct func, AppFriend app, object src, out object arg, out ResolveArgument resolveArgument) { if (src == null) { AppVar appVar = app.Dim(); arg = appVar; resolveArgument = () =>func(appVar); } else { arg = src; IAppVarOwner owner = src as IAppVarOwner; resolveArgument = () => (owner != null && AppVarUtility.IsNull(owner.AppVar)) ? null : src; } }
static void ResolveAppVarRefOutArgs(AppFriend app, Type type, object src, out object arg, out ResolveArgument resolveArgument) { if (src == null) { AppVar appVar = app.Dim(); arg = appVar; resolveArgument = () => appVar; } else { arg = src; resolveArgument = () => src; } }