private string BuildBinder(BuildStackTrace trace, DXMappingResult result, PBinder binder) { // 직접 입력 값 if (binder.IsDirectValue) { object value = binder.DirectValue; if (value is string vStr) { Match match = Regex.Match(vStr, "(?<=^\")(\\d+\\.\\d+|\\d+)(?=\"$)"); if (match.Success) { return(vStr); } else if (double.TryParse(vStr, out double v)) { return(v.ToString()); } else if (vStr == "\"\"") { return(vStr); } } return(MappingProvider.GetValueLine(value, true)); } // 연결된 파라미터가 없음 if (binder.Items.Count == 0) { return(null); } // 연결된 파라미터의 부모 (컴포넌트) var previousHost = binder.Items[0].Host as PBinderHost; string mappingCode = previousHost.GetAttribute <TAttribute>().MappingCode; if (binder.HasAttribute <TAttribute>()) { mappingCode = binder.GetAttribute <TAttribute>().MappingCode; } // 코드 매핑 var r = buildImpl(trace, previousHost, mappingCode); string valueLine = r.Source; foreach (var token in r.Errors) { result.AddErrorToken(token); } foreach (var token in r.Resolved) { result.AddResolvedToken(token); } // 대입 값인 경우 대상 속성에 따라 캐스팅이 필요함 if ((binder as PParameterBinder).Host is PSetter setter) { if (setter.ValueBinder.Equals(binder)) { Type valueType = previousHost.GetType(); if (previousHost is PFunction prevFunc) { valueType = prevFunc.FunctionInfo.ReturnType; } if (previousHost is PGetter prevGetter) { valueType = prevGetter.Property.PropertyType; } if (previousHost is PLayoutBinderHost prevLayout) { valueType = prevLayout.LogicalParent.GetType(); } if (previousHost is PSelector prevSelector) { valueType = prevSelector.TargetVisual.GetType(); } if (setter.Property == null && previousHost is PStructure structure) { if (structure.Fields.Count > 0) { var builder = new StringBuilder(); var attr = typeof(PDataField).GetAttribute <TAttribute>(); PDataField[] fields = structure.Fields .Where(f => f.ValueBinder.Items.Count > 0) .OrderBy(f => f.ValueBinder.Items[0].Host is PFunction ? 1 : 0) .ToArray(); for (int i = 0; i < fields.Length; i++) { if (fields[i].ValueBinder.Items.Count == 0) { continue; } var fieldResult = buildImpl(trace, fields[i], attr.MappingCode); if (builder.Length > 0) { builder.Append(", "); } builder.Append(fieldResult.Source); } return(builder.ToString()); } return(""); } if (setter.Property.PropertyType != valueType || setter.Property.Name == "Source") { // on wpf if (setter.Property.Name == "Source") { return(this.MappingProvider.Casting(typeof(ImageSource), valueLine)); } // casting return(this.MappingProvider.Casting(setter.Property.PropertyType, valueLine)); } } } return(valueLine); }