Compare commits

...

1 Commits

Author SHA1 Message Date
b7ccc387fc Save 2025-10-25 16:08:12 +08:00

View File

@@ -8,52 +8,113 @@ using System.Threading.Tasks;
namespace Convention.RScript.Variable namespace Convention.RScript.Variable
{ {
[System.AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)] namespace Attr
public sealed class RScriptMethodAttribute : Attribute
{ {
public string Description { get; set; } [AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)]
public class SerializeAttribute : Attribute
{
public string Description { get; set; }
}
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class MethodAttribute : SerializeAttribute
{
}
[System.AttributeUsage(AttributeTargets.Enum, Inherited = true, AllowMultiple = false)]
public sealed class EnumAttribute : SerializeAttribute
{
}
} }
public abstract class RScriptInjectVariable public abstract class RScriptInjectVariable
{ {
public string RScriptString { get; private set; } public string RScriptString { get; private set; }
protected abstract string WritePageHead(Type currentType);
#region Enum
protected abstract string WriteEnumHead(Type currentEnum);
protected abstract string WriteEnumBodyEnter(Type currentType);
protected abstract string WriteEnumName(string enumName, Type valueType);
protected abstract string WriteEnumBodyExit(Type currentType);
protected abstract string WriteEnumTail(Type currentType);
#endregion
#region Class
protected abstract string WriteClassHead(Type currentType); protected abstract string WriteClassHead(Type currentType);
protected abstract string WriteClassBodyEnter(Type currentType); protected abstract string WriteClassBodyEnter(Type currentType);
protected abstract string WriteClassMethod(Type returnType, string methodName, string[] parameterNames, Type[] parameterTypes, string description); protected abstract string WriteClassMethod(Type returnType, string methodName, string[] parameterNames, Type[] parameterTypes, string description);
protected abstract string WriteClassBodyExit(Type currentType); protected abstract string WriteClassBodyExit(Type currentType);
protected abstract string WriteClassTail(Type currentType); protected abstract string WriteClassTail(Type currentType);
#endregion
protected abstract string WritePageEnd(Type currentType);
/// <summary>
/// 生成targetType类型的实体
/// </summary>
/// <returns></returns>
public delegate object Generater(); public delegate object Generater();
private Generater MyGenerater; private Generater MyGenerater;
public string name { get; private set; }
public readonly static Dictionary<string, RScriptInjectVariable> AllRScriptInjectVariables = new();
public readonly string name;
public readonly string script;
public object Generate() public object Generate()
{ {
return MyGenerater(); return MyGenerater();
} }
public RScriptInjectVariable([MaybeNull]Generater generater, string name) public RScriptInjectVariable(Type targetType, [MaybeNull]Generater generater, string name)
{ {
var currentType = this.GetType(); if (AllRScriptInjectVariables.ContainsKey(name))
StringBuilder builder = new(); throw new InvalidOperationException($"{name} is been used");
builder.AppendLine(this.WriteClassHead(currentType));
builder.AppendLine(this.WriteClassBodyEnter(currentType));
var scriptMethods = from method in currentType.GetMethods(BindingFlags.Instance | BindingFlags.Public)
where method.GetCustomAttribute<RScriptMethodAttribute>() != null
select method;
foreach (var method in scriptMethods)
{ {
var attr = method.GetCustomAttribute<RScriptMethodAttribute>(); StringBuilder builder = new();
var returnType = method.ReturnType; builder.AppendLine(this.WritePageHead(targetType));
var methodName = method.Name; builder.AppendLine(this.WriteClassHead(targetType));
var parameters = method.GetParameters(); builder.AppendLine(this.WriteClassBodyEnter(targetType));
var parameterNames = from item in parameters select item.Name; // 绘制枚举
var parameterTypes = from item in parameters select item.ParameterType; {
builder.AppendLine(this.WriteClassMethod(returnType, methodName, parameterNames.ToArray(), parameterTypes.ToArray(), attr.Description)); var scriptEnums = from enumItem in targetType.GetNestedTypes(BindingFlags.NonPublic | BindingFlags.Public)
where enumItem.GetCustomAttribute<Attr.EnumAttribute>() != null
select enumItem;
foreach (var enumItem in scriptEnums)
{
var attr = enumItem.GetCustomAttribute<Attr.EnumAttribute>();
}
}
// 绘制方法
{
var scriptMethods = from method in targetType.GetMethods(BindingFlags.Instance | BindingFlags.Public)
where method.GetCustomAttribute<Attr.MethodAttribute>() != null
select method;
foreach (var method in scriptMethods)
{
var attr = method.GetCustomAttribute<Attr.MethodAttribute>();
var returnType = method.ReturnType;
var methodName = method.Name;
var parameters = method.GetParameters();
var parameterNames = from item in parameters select item.Name;
var parameterTypes = from item in parameters select item.ParameterType;
builder.AppendLine(this.WriteClassMethod(returnType, methodName, parameterNames.ToArray(), parameterTypes.ToArray(), attr.Description));
}
}
builder.AppendLine(this.WriteClassBodyExit(targetType));
builder.AppendLine(this.WriteClassTail(targetType));
builder.AppendLine(this.WritePageEnd(targetType));
this.script = builder.ToString();
} }
builder.AppendLine(this.WriteClassBodyExit(currentType));
builder.AppendLine(this.WriteClassTail(currentType));
this.MyGenerater = generater; this.MyGenerater = generater;
this.name = name; this.name = name;