ServParam2ClientModelEngine/CoderEngine/AjaxCodeWrite.cs

211 lines
7.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace CoderEngine
{
public class AjaxCodeWrite
{
private string CodeStr = "";
/// <summary>
/// 一个代码缩进
/// </summary>
private string tabstr = " ";
/// <summary>
/// 逐行添加代码
/// </summary>
/// <param name="codeline"></param>
/// <returns></returns>
public void CoderAddLine(string CodeLine)
{
CodeStr += CodeLine + "\n";
}
/// <summary>
/// 倍数缩进
/// </summary>
/// <param name="Number"></param>
public string TabstrForNumber(int Number)
{
string str = "";
if (Number < 0)
Number = 0;
for (int i = 0; i < Number; i++)
{
str += tabstr;
}
return str;
}
public string ModelToAjaxCode(string _AssemblyName, string _TypeName)
{
TypeMode tm = new _ModleReader().ModelCheck(_AssemblyName, _TypeName);
ModelToAjaxCodeWriter(tm);
return CodeStr;
}
public void ModelToAjaxCodeWriter(TypeMode TopMode)
{
CoderAddLine("");
CoderAddLine("//生成Ajax请求后解析返回值的js代码");
CoderAddLine("success: function(data) {//请求完成");
CoderAddLine(tabstr + "var ob = JSON.parse(data.Value);//序列化Value字符串为json对象");
//如果有代码嵌套的下级类 在本类外 写入新的类
if (TopMode.TypeList != null && TopMode.TypeList.Count > 0)
{
CoderAddLine(tabstr);
AjaxCodeDownRecursion(TopMode,"",1);
}
CoderAddLine("}");
}
public void AjaxCodeDownRecursion(TypeMode TopMode,string ParentCode, int TabNumber)
{
if (ParentCode == null || ParentCode == "")
ParentCode = "ob";
string ClassName = "";
//如果自己就是集合类型 则取类型下名字
if (TopMode.MemberType.Name == "List`1")
{
//FullName的值为 "System.Collections.Generic.List`1[[ --集合内嵌类型名称--, CoderEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"
//其中包含内嵌List的名称 我们要将其取出 得到的值例如 “程序集.*.*类型”
var SonParamName = TopMode.MemberType.FullName.Substring(TopMode.MemberType.FullName.IndexOf("[") + 2);
SonParamName = SonParamName.Substring(0, SonParamName.IndexOf(","));
ClassName = SonParamName.Substring(SonParamName.LastIndexOf(".") + 1);
CoderAddLine(TabstrForNumber(TabNumber-1) + "//循环取内嵌集合"+ ParentCode+ "数据");
CoderAddLine(TabstrForNumber(TabNumber-1) + "for(i" + TabNumber + " = 0;i" + TabNumber + " < " + ParentCode+ ".lenght;i" + TabNumber + "++){");
foreach (var tl in TopMode.TypeList)
{
if (tl.MemberType.Name == "List`1")
{
CoderAddLine(TabstrForNumber(TabNumber) + ParentCode + "[i"+ TabNumber + "]." + tl.Name + ";//集合 " + CSharpToJavaTypeName(tl.MemberType));
CoderAddLine(TabstrForNumber(TabNumber) + ParentCode + "[i"+ TabNumber + "]." + tl.Name + ".lenght;//集合" + tl.Name + "的成员数量");
if (tl.TypeList != null && tl.TypeList.Count > 0)
{
CoderAddLine("");
ParentCode = ParentCode + "[i" + TabNumber + "]";
string ParentCodeStr = "";
if (ParentCode != null)
ParentCodeStr = ParentCode + "." + tl.Name;
else
ParentCodeStr = "ob." + tl.Name;
AjaxCodeDownRecursion(tl, ParentCodeStr, TabNumber + 1);
}
}
else
{
CoderAddLine(TabstrForNumber(TabNumber) + ParentCode + "[i" + TabNumber + "]." + tl.Name + ";//成员参数 " + CSharpToJavaTypeName(tl.MemberType));
}
}
CoderAddLine(TabstrForNumber(TabNumber-1) + "}");
}
else
{
ClassName = TopMode.MemberType.Name;
foreach (var tl in TopMode.TypeList)
{
if (tl.MemberType.Name == "List`1")
{
CoderAddLine(TabstrForNumber(TabNumber) + ParentCode + "." + tl.Name + ";//集合 " + CSharpToJavaTypeName(tl.MemberType));
CoderAddLine(TabstrForNumber(TabNumber) + ParentCode + "." + tl.Name + ".lenght;//集合" + tl.Name + "的成员数量");
if (tl.TypeList != null && tl.TypeList.Count > 0)
{
CoderAddLine("");
string ParentCodeStr = "";
if (ParentCode != null)
ParentCodeStr = ParentCode + "." + tl.Name;
else
ParentCodeStr = "ob." + tl.Name;
AjaxCodeDownRecursion(tl, ParentCodeStr, TabNumber + 1);
}
}
else
{
CoderAddLine(TabstrForNumber(TabNumber) + ParentCode + "."+ tl.Name + ";//成员参数 " + CSharpToJavaTypeName(tl.MemberType));
}
}
}
}
/// <summary>
/// 转换成JS代码描述
/// </summary>
/// <returns></returns>
public string CSharpToJavaTypeName(Type myType)
{
var oneinfo = CSharpToJSTypeItem.Where(w => w.Key == myType.Name).FirstOrDefault();
if (oneinfo.Value != null)
{
return "类型为 " + oneinfo.Value;
}
else
{
if (myType.Name == "List`1")
{
return "";
}
else if (myType.Name == "Nullable`1")
{
var SonParamName = myType.FullName.Substring(myType.FullName.IndexOf("[") + 2);
SonParamName = SonParamName.Substring(0, SonParamName.IndexOf(","));
//string var = SonParamName.Substring(SonParamName.LastIndexOf('.') + 1);
string SonParamFromAssemblyName = SonParamName.Substring(0, SonParamName.IndexOf('.'));
//貌似反射加载System是不行的是吗
//Type PerentType = System.GetType(SonParamName);
return "";
}
else
return "类型为 " + "string";
}
}
/// <summary>
/// C#和JS代码对照表
/// </summary>
public System.Collections.Generic.Dictionary<string, string> CSharpToJSTypeItem =
new Dictionary<string, string>() {
{ "int","int"},
{ "Int16","int"},
{ "Int32","int"},
{ "Int64","int"},
{ "long","long"},
{ "float","float"},
{ "double","double"},
{ "boolean","boolean"},
{ "string","string"},
{ "DateTime","时间格式形如 1999-99-99 10:10:10"},
};
}
}