/// <remarks> /// TODO: need to find a better way to invoke instance method and pass paramethers /// </remarks> public static T InvokeOverridden <T>(this IUIContext context, Func <T> defaultImplementation, params object[] parameters) { StackTrace stackTrace = new StackTrace(); var caller = stackTrace.GetFrame(1).GetMethod(); var overridden = context.GetType().GetMethod(caller.Name); if (overridden != null && VerifyMethodSignature(caller, overridden)) { return((T)overridden.Invoke(context, parameters)); } else { return(defaultImplementation.Invoke()); } }
public static IUISelector <T> createSelector <T>(IUIContext context, string name, Action <T> updateFunc = null #if UNITY_EDITOR && UI_SELECTOR_STATS , [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "", [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0 #endif ) { if (!context.ContainsProperty(name)) { throw new ArgumentException($"Property {name} not registered in context {context.GetType().FullName}"); } object target; if (context.target.TryGetTarget(out target) && context.implementsInterfaces != null) { foreach (var implementInterface in context.implementsInterfaces) { if (implementInterface.GetProperty(name) != null && !implementInterface.IsGenericType && !implementInterface.IsAssignableFrom(target.GetType())) { Debug.LogWarning("The data type of " + target.GetType() + " does not implement the interface " + implementInterface.Name); } } } Func <T> propertyGetter = () => { object getterTarget; if (!context.target.TryGetTarget(out getterTarget)) { Debug.LogError("Cannot get the Target Reference"); } if (PropertyContainer.TryGetValue <T>(ref getterTarget, name, out var value)) { return(value); } else { return(default);