/// <summary> /// Return true on flow body can be simplify to lambda expression code. /// </summary> /// <param name="target"></param> /// <param name="returnType"></param> /// <param name="parameterTypes"></param> /// <returns></returns> public static bool CanSimplifyToLambda(MemberData target, Type returnType, IList <Type> parameterTypes) { if (target.IsTargetingNode) { var bodyNode = target.GetTargetNode(); if (bodyNode is MultipurposeNode) { var node = bodyNode as MultipurposeNode; if (node.target.target.isAssigned && !node.onFinished.isAssigned) { System.Type[] memberTypes = null; if (node.target.target.targetType == MemberData.TargetType.Method) { var members = node.target.target.GetMembers(false); if (members != null && members.Length > 0) { var lastMember = members.LastOrDefault() as System.Reflection.MethodInfo; if (lastMember != null && lastMember.ReturnType == returnType) { memberTypes = lastMember.GetParameters().Select(i => i.ParameterType).ToArray(); } } } else if (node.target.target.targetType == MemberData.TargetType.uNodeFunction) { uNodeFunction func = node.target.target.GetUnityObject() as uNodeFunction; if (func != null && func.ReturnType() == returnType) { memberTypes = func.parameters.Select(i => i.Type).ToArray(); } } if (memberTypes != null) { if (parameterTypes.Count == memberTypes.Length && node.target.parameters.Length == memberTypes.Length) { bool flag = true; for (int x = 0; x < parameterTypes.Count; x++) { if (parameterTypes[x] != memberTypes[x]) { flag = false; break; } } if (flag) { for (int x = 0; x < parameterTypes.Count; x++) { var p = node.target.parameters[x]; if (p.targetType != MemberData.TargetType.NodeFieldElement || p.GetAccessIndex() != x) { flag = false; break; } } if (flag) { return(true); } } } } } } } return(false); }
protected override void InitializeView() { base.InitializeView(); // titleIcon.image = null; NodeReturn node = targetNode as NodeReturn; if (!node.returnAnyType) { var parent = node.parentComponent; if (parent != null && parent is uNodeProperty) { uNodeProperty m = parent as uNodeProperty; if (m.CanGetValue() && m.ReturnType() != typeof(void)) { AddInputValuePort( new PortData() { portID = "return", onValueChanged = (o) => { RegisterUndo(); node.returnValue = o as MemberData; }, getPortName = () => "", getPortType = () => m.ReturnType(), getPortValue = () => node.returnValue, } ); } } else if (node.rootObject != null && node.rootObject is uNodeFunction) { uNodeFunction m = node.rootObject as uNodeFunction; if (m.ReturnType() != typeof(void)) { AddInputValuePort( new PortData() { portID = "return", onValueChanged = (o) => { RegisterUndo(); node.returnValue = o as MemberData; }, getPortName = () => "", getPortType = () => m.ReturnType(), getPortValue = () => node.returnValue, } ); } } } else { AddInputValuePort( new PortData() { portID = "return", onValueChanged = (o) => { RegisterUndo(); node.returnValue = o as MemberData; }, getPortName = () => "", getPortType = () => typeof(object), getPortValue = () => node.returnValue, } ); } if (uNodeUtility.preferredDisplay != DisplayKind.Full) { ConstructCompactTitle("return"); } }