using System;
using System.CodeDom;
using System.Data;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
namespace DataMap
{
/// <summary>
/// TemplateCodeGenerator 的摘要说明。
/// </summary>
public class TemplateCodeGenerator
{
private string _privateMemberPrefix="_";
private string _Namespace="DataMap";
private string _OutputPath;
public string OutputPath
{
get
{
if(_OutputPath==null)
_OutputPath="";
if(_OutputPath!="" && !_OutputPath.EndsWith("//"))
_OutputPath+="//";
return _OutputPath;
}
set
{
_OutputPath=value;
}
}
public string Namespace
{
get
{
return _Namespace;
}
set
{
_Namespace=value;
}
}
public void generateCode()
{
System.Collections.SortedList sl;
sl=DataHelper.getInstance().getMetaData();
for(int i=0;i<sl.Count;i++)
{
string table=(string)sl.GetKey(i).ToString();
string className=table.Replace(" ","_");
System.Collections.SortedList slColumn=(System.Collections.SortedList)sl[table];
CodeCompileUnit compileunit = new CodeCompileUnit();
CodeNamespace cn = new CodeNamespace(_Namespace);
cn.Imports.Add( new CodeNamespaceImport("System") );
cn.Imports.Add( new CodeNamespaceImport("DataMap") );
CodeTypeDeclaration codeType = new CodeTypeDeclaration(className);
cn.Types.Add(codeType);
for(int j=0;j<slColumn.Count;j++)
{
string column=(string)slColumn.GetKey(j).ToString();
string fieldName=column.Replace(" ","_");
Type type=DataHelper.getInstance().getTypeByDbType(slColumn[column].ToString());
CodeMemberField field=new System.CodeDom.CodeMemberField(type,_privateMemberPrefix+column);
// field.Name=_privateMemberPrefix+column;
codeType.Members.Add(field);
CodeMemberProperty prop=new CodeMemberProperty();
prop.Name=column;
prop.Type=new CodeTypeReference(type);
prop.GetStatements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression(_privateMemberPrefix+fieldName)));
prop.SetStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression(_privateMemberPrefix+fieldName),new CodeVariableReferenceExpression("value")));
CodeAttributeArgument[] attrArgs=new CodeAttributeArgument[1];
attrArgs[0]=new CodeAttributeArgument(new CodeSnippetExpression("/""+column+"/""));
prop.CustomAttributes.Add(new CodeAttributeDeclaration("DataAt",attrArgs));
prop.Attributes=MemberAttributes.Public | MemberAttributes.Final;
codeType.Members.Add(prop);
}
CodeAttributeArgument[] attrClassArgs=new CodeAttributeArgument[1];
attrClassArgs[0]=new CodeAttributeArgument(new CodeSnippetExpression("/"["+table+"]/""));
codeType.CustomAttributes.Add(new CodeAttributeDeclaration("DataAt",attrClassArgs));
compileunit.Namespaces.Add(cn);
ICodeGenerator cg =new CSharpCodeProvider().CreateGenerator();
System.IO.StreamWriter sw=new System.IO.StreamWriter(this.OutputPath+className+".cs",false);
cg.GenerateCodeFromCompileUnit(compileunit,sw,null);
sw.Close();
}
}
}
}
//DataAtAttribute的作用是对生成对象作标识,对应数据库中的表或字段
using System;
namespace DataMap
{
///
/// DataAtAttribute 的摘要说明。
///
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Class, AllowMultiple=true)]
public class DataAtAttribute:System.Attribute
{
private string _DataField;
private bool _IsPrimaryKey;
public DataAtAttribute(string dataField)
{
_DataField=dataField;
}
public DataAtAttribute(string dataField,bool isPrimaryKey)
{
_DataField=dataField;
_IsPrimaryKey=isPrimaryKey;
}
public string DataField
{
get
{
return _DataField;
}
}
public bool IsPrimaryKey
{
get
{
return _IsPrimaryKey;
}
}
}
}