c#動態建立記憶體模型(筆記)

來源:互聯網
上載者:User

支援可為Null的模型屬性:

基礎:實值型別是繼承ValueType、物件類型是繼承ObjectType;因此,我們只要看基底類型屬於那種就可以添加:“?”

    ///<summary>
/// 動態建立記憶體模型
///</summary>
public class CreateDnyModel
{
///<summary>
/// Dictionary {屬性名稱,屬性類型}
///</summary>
private Dictionary<string, Type> dicList = new Dictionary<string, Type>();
///<summary>
/// 添加命名空間
///</summary>
private List<string> namespaceList = new List<string>();
//添加引用集合
private List<string> assemblyList = new List<string>();
public void Add(string columnName, Type columnType)
{
dicList.Add(columnName, columnType);
}

public void AddNamespace(string nameSpace)
{
if (!namespaceList.Contains(nameSpace))
namespaceList.Add(nameSpace);
}
public void AddAssembly(string assembly)
{
if (!assemblyList.Contains(assembly))
assemblyList.Add(assembly);
}

public object BuilderModel()
{
CodeDomProvider cdp = new CSharpCodeProvider(); //CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cp = new CompilerParameters();
foreach (string assembly in assemblyList)
{
cp.ReferencedAssemblies.Add(assembly);
}
cp.ReferencedAssemblies.Add("System.dll");
cp.GenerateExecutable = true;
cp.GenerateInMemory = true;
CompilerResults cr = cdp.CompileAssemblyFromSource(cp, BiulderCode()); //cdp.CompileAssemblyFromSource(cp, GetCSharpCode());
if (cr.Errors.Count > 0)
{
return null;
}
Assembly asm = cr.CompiledAssembly;
return asm.CreateInstance("MyDnyModel.DnyModel_Memory");
}

private string BiulderCode()
{
CodeDomProvider cdp = new CSharpCodeProvider();
CodeCompileUnit codeCompileUnit = GetCodeCompileUnit();
ICodeGenerator gen = cdp.CreateGenerator();
using (MemoryStream memoryStream = new MemoryStream())
{
using (StreamWriter stream = new StreamWriter(memoryStream))
{
IndentedTextWriter tw = new IndentedTextWriter(stream, "");
ICodeGenerator ICG = cdp.CreateGenerator();
ICG.GenerateCodeFromCompileUnit(codeCompileUnit, tw, new CodeGeneratorOptions());
}
byte[] buf = memoryStream.ToArray();
return Encoding.Default.GetString(buf);
}
}

private CodeCompileUnit GetCodeCompileUnit()
{
CodeCompileUnit CompileUnit = new CodeCompileUnit();

CodeNamespace MyDnyModel = new CodeNamespace("MyDnyModel");//建立命名空間
CompileUnit.Namespaces.Add(MyDnyModel);

foreach (string nameSpace in namespaceList)
{
MyDnyModel.Imports.Add(new CodeNamespaceImport(nameSpace));//匯入架構的命名空間
}

CodeTypeDeclaration DnyModel_Memory = new CodeTypeDeclaration("DnyModel_Memory");//類型定義
DnyModel_Memory.IsClass = true;
MyDnyModel.Types.Add(DnyModel_Memory);

string Null = string.Empty;
foreach (var entry in dicList)
{
if (entry.Value.BaseType != typeof(ValueType))
Null = "";
else
Null = " ? ";
DnyModel_Memory.Members.Add(GetField(entry.Key, Null, entry.Value));
DnyModel_Memory.Members.Add(GetFieldProperty(entry.Key, Null, entry.Value));
}

CodeMemberMethod main = new CodeMemberMethod();
main.Name = "Main";
main.ReturnType = new CodeTypeReference(typeof(void));
main.Attributes = MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static;
DnyModel_Memory.Members.Add(main);

CodeConstructor con = new CodeConstructor();//建構函式
con.Attributes = MemberAttributes.Public;
DnyModel_Memory.Members.Add(con);

return CompileUnit;
}

private CodeMemberProperty GetFieldProperty(string columnName, string Null, Type columnType)
{
CodeMemberProperty member = new CodeMemberProperty();
member.HasGet = true;
member.HasSet = true;
member.Attributes = MemberAttributes.Public | MemberAttributes.Final;
member.Name = Null + columnName;
member.Type = new CodeTypeReference(columnType);
member.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
"_" + columnName)));
member.SetStatements.Add(
new CodeAssignStatement(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_" + columnName),
new CodePropertySetValueReferenceExpression()));

return member;
}

private CodeMemberField GetField(string columnName, string Null, Type columnType)
{
return new CodeMemberField(columnType, Null + "_" + columnName) { Attributes = MemberAttributes.Private };
}
}

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.