一段由数据库结构生成相应数据对象的代码(4)(5)


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;
   }
  }
 }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值