From 249a2f9ce36add06f13ca62b20a54ca23144398d Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Mon, 15 Dec 2025 11:38:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E7=BD=AE=E6=9B=B4=E5=8A=A0=E5=8F=8B?= =?UTF-8?q?=E5=A5=BD=E7=9A=84=E7=B1=BB=E5=9E=8B=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PublicTypes/InjectVariable/CStyle.cs | 80 ++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/PublicTypes/InjectVariable/CStyle.cs b/PublicTypes/InjectVariable/CStyle.cs index 5989ceb..03d741a 100644 --- a/PublicTypes/InjectVariable/CStyle.cs +++ b/PublicTypes/InjectVariable/CStyle.cs @@ -1,14 +1,79 @@ using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; -using System.Threading.Tasks; namespace Convention.RScript.Variable.CStyle { public class CScriptRScriptVariableGenerater : RScriptInjectVariableGenerater { + /// + /// 获取类型的友好显示名称,支持泛型、数组等复杂类型 + /// + public static string GetFriendlyName(Type type) + { + if (type == null) return null; + + // 处理泛型类型 + if (type.IsGenericType) + { + // 特殊处理可空类型(Nullable) + if (type.IsNullable()) + { + return $"{GetFriendlyName(type.GetGenericArguments()[0])}?"; + } + + var sb = new StringBuilder(); + // 获取类型基础名称(移除 `1, `2 等后缀) + string baseName = type.Name.Contains('`') ? type.Name[..type.Name.IndexOf('`')] : type.Name; + sb.Append(baseName); + sb.Append('<'); + + // 递归处理泛型参数 + Type[] args = type.GetGenericArguments(); + for (int i = 0; i < args.Length; i++) + { + if (i > 0) sb.Append(", "); + sb.Append(GetFriendlyName(args[i])); + } + + sb.Append('>'); + return sb.ToString(); + } + + // 处理数组类型 + if (type.IsArray) + { + string elementName = GetFriendlyName(type.GetElementType()); + int rank = type.GetArrayRank(); + return rank == 1 ? $"{elementName}[]" : $"{elementName}[{new string(',', rank - 1)}]"; + } + + // 处理指针类型 + if (type.IsPointer) + { + return $"{GetFriendlyName(type.GetElementType())}*"; + } + + // 处理引用类型(ref/out 参数) + if (type.IsByRef) + { + return $"{GetFriendlyName(type.GetElementType())}&"; + } + + // 普通类型直接返回名称 + return type.Name; + } + + /// + /// 判断是否为可空类型 + /// + public static bool IsNullable(Type type) + { + return type.IsGenericType && + type.GetGenericTypeDefinition() == typeof(Nullable<>); + } + public static string GetTypename(Type type) { if (type == typeof(int)) @@ -21,12 +86,7 @@ namespace Convention.RScript.Variable.CStyle return "bool"; if (type == typeof(void)) return "void"; - if (type.IsEnum) - return type.FullName.Replace('`', '_'); - if (type.IsClass) - return type.FullName.Replace('`', '_'); - var name = type.Name.Replace('`', '_'); - return name; + return GetFriendlyName(type).Replace('`', '_'); } private int m_layer = 0; @@ -116,7 +176,9 @@ namespace Convention.RScript.Variable.CStyle protected override string WritePageHead(Type currentType) { - return $"#include\"{GetFilename(currentType.BaseType)}\""; + if (currentType.BaseType != null) + return $"#include\"{GetFilename(currentType.BaseType)}\""; + return string.Empty; } public override string GetFilename(Type currentType)