`
shirlly
  • 浏览: 1652576 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

dotnet代码自动生成机的实现(2)

    博客分类:
  • .NET
 
阅读更多
在syscolumns 里有一个字段xtype,该字段表示列的数据类型,俺定义了两个函数,能根据xtype的值得到对应的dotnet中的数据类型和sqldb数据类型:
private string getType(int iType)
        {
            string strResult = "";
            switch (iType)
            {
                case 34:
                    strResult = "Byte[]";
                    break;
                case 35:
                case 99:
                case 167:
                case 175:
                case 231:
                case 239:
                    strResult = "string";
                    break;
                case 48:
                case 52:
                case 56:
                case 127:
                    strResult = "int";
                    break;
                case 58:
                case 61:
                    strResult = "DateTime";
                    break;
                case 59:
                    strResult = "Single";
                    break;
                case 60:
                case 106:
                case 108:
                case 122:
                    strResult = "Decimal";
                    break;
                case 62:
                    strResult = "Double";
                    break;
                case 104:
                    strResult = "bool";
                    break;
                default:
                    strResult = "None";//"unknow" ; 
                    break;
            }
            return strResult + " ";
        }

        private string getSqlDBType(int iType)
        {
            string strResult = "";
            switch (iType)
            {
                case 34:
                    strResult = "SqlDbType.Image";
                    break;
                case 35:
                    strResult = "SqlDbType.Text";
                    break;
                case 48:
                    strResult = "SqlDbType.TinyInt";
                    break;
                case 52:
                    strResult = "SqlDbType.SmallInt";
                    break;
                case 56:
                    strResult = "SqlDbType.Int";
                    break;
                case 58:
                    strResult = "SqlDbType.SmallDateTime";
                    break;
                case 59:
                    strResult = "SqlDbType.Real";
                    break;
                case 60:
                    strResult = "SqlDbType.Money";
                    break;
                case 61:
                    strResult = "SqlDbType.DateTime";
                    break;
                case 62:
                    strResult = "SqlDbType.Float";
                    break;
                case 99:
                    strResult = "SqlDbType.NText";
                    break;
                case 104:
                    strResult = "SqlDbType.Bit";
                    break;
                case 106:
                    strResult = "SqlDbType.Decimal";
                    break;
                case 108:
                    strResult = "SqlDbType.Decimal";
                    break;
                case 122:
                    strResult = "SqlDbType.SmallMoney";
                    break;
                case 127:
                    strResult = "SqlDbType.BigInt";
                    break;
                case 165:
                    strResult = "SqlDbType.VarBinary";
                    break;
                case 167:
                    strResult = "SqlDbType.VarChar";
                    break;
                case 173:
                    strResult = "SqlDbType.Binary";
                    break;
                case 175:
                    strResult = "SqlDbType.Char";
                    break;
                case 189:
                    strResult = "SqlDbType.Timestamp";
                    break;
                case 231:
                    strResult = "SqlDbType.NVarChar";
                    break;
                case 239:
                    strResult = "SqlDbType.NChar";
                    break;
                default:
                    strResult = "None";//"unknow" ; 
                    break;
            }
            return strResult + " ";
        } 

当然,还有一个函数先介绍一下,后面有它的具体用法:
private string getTypeShort(int iType)
        {
            string strResult = "";
            switch (getType(iType).Trim())
            {
                case "Byte[]":
                    strResult = "img";
                    break;
                case "string":
                    strResult = "str";
                    break;
                case "int":
                    strResult = "i";
                    break;
                case "DateTime":
                    strResult = "dt";
                    break;
                case "Single":
                    strResult = "sig";
                    break;
                case "Decimal":
                    strResult = "dec";
                    break;
                case "Double":
                    strResult = "db";
                    break;
                case "bool":
                    strResult = "bl";
                    break;
                default:
                    strResult = "unknow";
                    break;
            }
            return strResult;
        }

现在有了上面的介绍和函数基础,我们可以逐步实现我们的目标了:
1.生成数据实体类的数据成员
大家看一下,对于一个字段id,整形,我们这样定义:
private int iId;
        public int Id
        {
            get
            {
                return iId;
            }
            set
            {
                iId = value;
            }
        } 

其中iId表示数据类型+字段名称,其中字段名称的第一个字母大写,代码实现如下:
private string BuildMember(DataSet ds)
        {
            StringBuilder sb = new StringBuilder();
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                int iType = (byte)dr["xtype"];
                string strType = getType(iType);
                string strName = dr["name"].ToString();
                strName = UpFirstChar(strName);
                string strShortType = getTypeShort(iType);
                string strPrivateline = "private " + strType + strShortType + strName + " ;\r\n";
                sb.Append(strPrivateline);
                string strPublicline = "public " + strType + strName + " \r\n";
                sb.Append(strPublicline);
                sb.Append("{\r\n");
                sb.Append("\tget\r\n");
                sb.Append("\t{\r\n");
                sb.Append("\t\treturn " + strShortType + strName + " ;\r\n");
                sb.Append("\t}\r\n");
                sb.Append("\tset\r\n");
                sb.Append("\t{\r\n");
                sb.Append("\t\t" + strShortType + strName + " = value ;\r\n");
                sb.Append("\t}\r\n");
                sb.Append("}\r\n");
                sb.Append("\r\n");
                sb.Append("\r\n");
            }
            return sb.ToString();
        } 

参数DataSet ds中的ds是通过上一页的sa.Fill(ds)得到的,dr["name"]表示字段名称,dr["xtype"] 是字段类型。
UpFirstChar函数负责把字符串的第一个字母大写:
private string UpFirstChar(string strvalue)
        {
            return strvalue.Substring(0, 1).ToUpper() + strvalue.Substring(1, strvalue.Length - 1);
        }


这样就生成了数据实体的数据成员。
2。生成Add方法
Add方法生成起来有点难度,可以参考第一页的程序,我们这里是通过参数的方法来实现add的。有一点要注意,就是在对参数赋值时要考虑参数值为空的情况。代码实现如下:
private string BuildAddFunction(DataSet ds)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("public bool Add()\r\n");
            sb.Append("{\r\n");
            sb.Append("\tSqlConnection conn = SqlConn.Instance().Connection ;\r\n");
            sb.Append("\r\n");
            string strInsert = "\"insert into " + strTableName + "(";
            string strFiledList = "";
            string strParamList = "";
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                string strName = dr["name"].ToString();
                strFiledList = strFiledList + strName + ", ";
                strParamList = strParamList + "@" + strName + ", ";
            }
            strFiledList = strFiledList.Trim().TrimEnd(',');
            strParamList = strParamList.Trim().TrimEnd(',');
            sb.Append("\tstring strSql = " + strInsert + strFiledList + ")\"\r\n");
            sb.Append("\t+\"values(" + strParamList + ")\" ;\r\n");
            sb.Append("\r\n");
            sb.Append("\tSqlCommand command = new SqlCommand(strSql,conn) ;\r\n");
            sb.Append("\r\n");
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                string strName = dr["name"].ToString();
                string strSqlType = getSqlDBType((byte)dr["xtype"]);
                string strShortType = getTypeShort((byte)dr["xtype"]);
                string strvalueName = strShortType + UpFirstChar(strName);
                int iLen = (Int16)dr["prec"];

                string strLen = "";
                if (strShortType == "str")
                    strLen = strLen + "," + iLen;
                string strCommandName = "\tcommand.Parameters.Add(\"@" + strName + "\"," + strSqlType + strLen + ") ;\r\n";

                string strCommandvalue = "\tcommand.Parameters[\"@" + strName + "\"].value = " + strvalueName + " ;\r\n";
                string strCommandNullvalue = "\tcommand.Parameters[\"@" + strName + "\"].value = DBNull.value ;\r\n";

                sb.Append(strCommandName);
                if (strShortType == "dt")
                    sb.Append("\tif (" + strvalueName + "!= DateTime.Minvalue )\r\n");
                else if (strShortType == "str")
                    sb.Append("\tif (" + strvalueName + "!= null )\r\n");
                else if (strShortType == "img")
                    sb.Append("\tif (" + strvalueName + "!= null )\r\n");
                else
                    sb.Append("");
                sb.Append(strCommandvalue);
                if (strShortType == "dt" || strShortType == "str" || strShortType == "img")
                {
                    sb.Append("\telse\r\n");
                    sb.Append(strCommandNullvalue);
                }
                sb.Append("\r\n");
            }

            sb.Append(AddCatchString());

            sb.Append("}\r\n");
            return sb.ToString();
        }

3。edit,delete的实现方法类似与add,就不详细说了,edit方法代码如下:
private string BuildModifyFunction(DataSet ds)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("public bool Modify()\r\n");
            sb.Append("{\r\n");
            sb.Append("\tSqlConnection conn = SqlConn.Instance().Connection ;\r\n");
            string strModify = "string strSql =\"update " + strTableName + " set ";

            string strParamList = "";
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                string strName = dr["name"].ToString();
                strParamList = strParamList + strName + " = @" + strName + ", ";
            }
            strParamList = strParamList.Trim().TrimEnd(',');
            sb.Append("\t" + strModify + strParamList + " \"\r\n");
            sb.Append("\t+ \" where id =@id \" ;\r\n");
            sb.Append("\tSqlCommand command = new SqlCommand(strSql,conn) ;\r\n");

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                string strName = dr["name"].ToString();
                string strSqlType = getSqlDBType((byte)dr["xtype"]);
                string strShortType = getTypeShort((byte)dr["xtype"]);
                string strvalueName = strShortType + UpFirstChar(strName);
                int iLen = (Int16)dr["prec"];

                string strLen = "";
                if (strShortType == "str")
                    strLen = strLen + "," + iLen;

                string strCommandName = "\tcommand.Parameters.Add(\"@" + strName + "\"," + strSqlType + strLen + ") ;\r\n";
                string strCommandvalue = "\tcommand.Parameters[\"@" + strName + "\"].value = " + strvalueName + " ;\r\n";
                sb.Append(strCommandName);
                sb.Append(strCommandvalue);
                sb.Append("\r\n");
            }

            sb.Append(AddCatchString());

            sb.Append("}\r\n");
            return sb.ToString();
        }

4。生成存储过程的执行方法和返回结果方法。存储过程的参数也在syscolumns表里有详细的说明,里面还记录了每个参数是不是传出参数,不过在这个函数里我没有考虑参数的方向,当然,要考虑进去也不是很麻烦。
private string BuildSPExec(DataSet ds)
        {
            StringBuilder sb = new StringBuilder();
            string strFuncParam = "";

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                int iType = (byte)dr["xtype"];
                string strName = UpFirstChar(dr["name"].ToString().TrimStart('@'));
                string strType = getType(iType);
                string strSqlType = getSqlDBType(iType);
                string strShortType = getTypeShort(iType);
                strFuncParam = strFuncParam + "\r\n\t\t" + strType + " a" + strShortType + strName + ",";
            }
            strFuncParam = strFuncParam.TrimEnd(',');
            string strDef = "public bool ExeSP_" + strTableName + "(" + strFuncParam + ")\r\n";
            sb.Append(strDef);
            sb.Append("{\r\n");
            sb.Append("\tSqlConnection conn = SqlConn.Instance().Connection ;\r\n");
            sb.Append("\r\n");
            sb.Append("\tstring strSPName = \"" + strTableName + "\" ;\r\n");
            sb.Append("\tSqlCommand command = new SqlCommand(strSPName,conn) ;\r\n");
            sb.Append("\tcommand.CommandType = CommandType.StoredProcedure ;\r\n");
            sb.Append("\r\n");

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                int iType = (byte)dr["xtype"];
                string strParaName = dr["name"].ToString();
                string strName = UpFirstChar(strParaName.TrimStart('@'));
                string strSqlType = getSqlDBType(iType);
                string strShortType = getTypeShort(iType);
                string strvalue = " a" + strShortType + strName;
                int iLen = (Int16)dr["prec"];

                string strLen = "";
                if (strShortType == "str")
                    strLen = strLen + "," + iLen;

                string strCommandAdd = "\tcommand.Parameters.Add(\"" + strParaName + "\"," + strSqlType + strLen + ") ;\r\n";
                string strCommandvalue = "\tcommand.Parameters[\"" + strParaName + "\"].value=" + strvalue + " ;\r\n";
                string strCommandNull = "\tcommand.Parameters[\"" + strParaName + "\"].value= DBNull.value ;\r\n";
                sb.Append(strCommandAdd);
                if (strShortType == "dt")
                    sb.Append("\tif (" + strvalue + "!= DateTime.Minvalue )\r\n\t");
                else if (strShortType == "str")
                    sb.Append("\tif (" + strvalue + "!= null )\r\n\t");
                else if (strShortType == "img")
                    sb.Append("\tif (" + strvalue + "!= null )\r\n\t");
                else
                    sb.Append("");
                sb.Append(strCommandvalue);
                if (strShortType == "dt" || strShortType == "str" || strShortType == "img")
                {
                    sb.Append("\telse\r\n\t");
                    sb.Append(strCommandNull);
                }
                sb.Append("\r\n");
            }
            sb.Append(AddCatchString());

            sb.Append("}\r\n");
            return sb.ToString();
        }

对于存储过程生成结果集的函数如下:
private string BuildSPGetData(DataSet ds)
        {
            StringBuilder sb = new StringBuilder();
            string strFuncParam = "";

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                int iType = (byte)dr["xtype"];
                string strName = UpFirstChar(dr["name"].ToString().TrimStart('@'));
                string strType = getType(iType);
                string strSqlType = getSqlDBType(iType);
                string strShortType = getTypeShort(iType);
                strFuncParam = strFuncParam + "\r\n\t\t" + strType + " a" + strShortType + strName + ",";
            }
            strFuncParam = strFuncParam.TrimEnd(',');
            string strDef = "public DataSet QuerySP_" + strTableName + "(" + strFuncParam + ")\r\n";
            sb.Append(strDef);
            sb.Append("{\r\n");
            sb.Append("\tSqlConnection conn = SqlConn.Instance().Connection ;\r\n");
            sb.Append("\r\n");
            sb.Append("\tstring strSPName = \"" + strTableName + "\" ;\r\n");
            sb.Append("\tSqlCommand command = new SqlCommand(strSPName,conn) ;\r\n");
            sb.Append("\tcommand.CommandType = CommandType.StoredProcedure ;\r\n");
            sb.Append("\r\n");

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                int iType = (byte)dr["xtype"];
                string strParaName = dr["name"].ToString();
                string strName = UpFirstChar(strParaName.TrimStart('@'));
                string strSqlType = getSqlDBType(iType);
                string strShortType = getTypeShort(iType);
                string strvalue = " a" + strShortType + strName;
                int iLen = (Int16)dr["prec"];

                string strLen = "";
                if (strShortType == "str")
                    strLen = strLen + "," + iLen;

                string strCommandAdd = "\tcommand.Parameters.Add(\"" + strParaName + "\"," + strSqlType + strLen + ") ;\r\n";
                string strCommandvalue = "\tcommand.Parameters[\"" + strParaName + "\"].value=" + strvalue + " ;\r\n";
                string strCommandNull = "\tcommand.Parameters[\"" + strParaName + "\"].value= DBNull.value ;\r\n";
                sb.Append(strCommandAdd);
                if (strShortType == "dt")
                    sb.Append("\tif (" + strvalue + "!= DateTime.Minvalue )\r\n\t");
                else if (strShortType == "str")
                    sb.Append("\tif (" + strvalue + "!= null )\r\n\t");
                else if (strShortType == "img")
                    sb.Append("\tif (" + strvalue + "!= null )\r\n\t");
                else
                    sb.Append("");
                sb.Append(strCommandvalue);
                if (strShortType == "dt" || strShortType == "str" || strShortType == "img")
                {
                    sb.Append("\telse\r\n\t");
                    sb.Append(strCommandNull);
                }
                sb.Append("\r\n");
            }

            sb.Append("\tSqlDataAdapter sdaResult = new SqlDataAdapter(command) ;\r\n");
            sb.Append("\tDataSet ds = new DataSet() ;\r\n");


            sb.Append(AddCatchQueryString());

            sb.Append("}\r\n");
            return sb.ToString();

        }

下面是生成结果集的执行结果:
public DataSet QuerySP_ddms_GetBank(
int aiPrsn_id)
        {
            SqlConnection conn = SqlConn.Instance().Connection;

            string strSPName = "ddms_GetBank";
            SqlCommand command = new SqlCommand(strSPName, conn);
            command.CommandType = CommandType.StoredProcedure;

            command.Parameters.Add("@prsn_id", SqlDbType.Int);
            command.Parameters["@prsn_id"].value = aiPrsn_id;

            SqlDataAdapter sdaResult = new SqlDataAdapter(command);
            DataSet ds = new DataSet();
            try
            {
                sdaResult.Fill(ds);
            }
            catch (Exception e)
            {
                throw (new Exception("Error in the Database" + e.Message));
            }
            finally
            {
                sdaResult.Dispose();
            }
            return ds;
        }

还有两个函数在程序中用到了,如下所示:
private string AddCatchString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("\ttry\r\n");
            sb.Append("\t{\r\n");
            sb.Append("\t\tconn.Open() ;\r\n");
            sb.Append("\t\tcommand.ExecuteNonQuery() ;\r\n");
            sb.Append("\t\treturn true ;\r\n");
            sb.Append("\t}\r\n");
            sb.Append("\tcatch(Exception e)\r\n");
            sb.Append("\t{\r\n");
            sb.Append("\t\tthrow(new Exception(\"Error in the Database\"+e.Message)) ;\r\n");
            sb.Append("\t}\r\n");
            sb.Append("\tfinally\r\n");
            sb.Append("\t{\r\n");
            sb.Append("\t\tconn.Close() ;\r\n");
            sb.Append("\t}\r\n");
            return sb.ToString();
        }

        private string AddCatchQueryString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("\ttry\r\n");
            sb.Append("\t{\r\n");
            sb.Append("\t\tsdaResult.Fill(ds) ;\r\n");
            sb.Append("\t}\r\n");
            sb.Append("\tcatch(Exception e)\r\n");
            sb.Append("\t{\r\n");
            sb.Append("\t\tthrow(new Exception(\"Error in the Database\"+e.Message)) ;\r\n");
            sb.Append("\t}\r\n");
            sb.Append("\tfinally\r\n");
            sb.Append("\t{\r\n");
            sb.Append("\t\tsdaResult.Dispose() ;\r\n");
            sb.Append("\t}\r\n");
            sb.Append("\treturn ds ;\r\n");
            return sb.ToString();
        } 

顺便说一下,文章开头的一段代码就是用这个程序生成的,当然,这种方法还有待完善的地方,希望大家指正。
原文连接:http://www.host01.com/article/Net/00020006/0561213181730059.htm
分享到:
评论

相关推荐

    动软代码自动生成器(DOTNET三层开发)

    标题中的“动软代码自动生成器(DOTNET三层开发)”是一款专为.NET开发者设计的工具,主要用于加速.NET框架下的三层架构开发。三层架构是一种常见的软件设计模式,它将应用程序分为表现层(UI)、业务逻辑层(BLL)和...

    DotNet代码生成器_动软

    DotNet代码生成器是针对微软的.NET框架设计的一款高效开发工具,主要目的是为了加速软件开发过程,通过自动化的方式自动生成符合特定需求的源代码。动软作为该代码生成器的品牌,旨在提供简单易用且功能强大的解决...

    dotnet-一个用于解析swaggerjson生成符合WebApiClient接口代码的代码生成工具

    标题中的“dotnet-一个用于解析swaggerjson生成符合WebApiClient接口代码的代码生成工具”指出,这是一个基于.NET框架的工具,其主要功能是解析Swagger JSON格式的文档,自动生成符合WebApiClient规范的接口代码。...

    dotnet format 忽略生成代码的格式化.rar

    4. **自动生成代码的处理**:详细阐述如何在使用Roslyn analyzers、T4模板、Source Generators等自动生成代码时,确保它们不受dotnet format影响。 5. **案例分析**:提供具体的项目案例,展示如何在实际开发中配置...

    基于T4引擎的代码自动生成器

    总结来说,基于T4引擎的代码自动生成器是一种强大的工具,结合了模板语言和编程逻辑,实现了代码的自动化生成。通过合理利用这个工具,开发者可以显著提升开发效率,专注于更高级别的业务逻辑和创新,而不是沉溺于...

    dotnet 用 SourceGenerator 源代码生成技术实现中文编程语言.rar

    这对于生成元数据、自动生成API绑定或者在编译时执行特定逻辑非常有用。 在本案例中,我们关注的是使用SourceGenerator实现中文编程语言的支持。这可能涉及到解析和理解中文关键字、标识符,以及构建相应的语法解析...

    C#自动代码生成器源码

    本资源是C#语言实现的自动代码生成器的源码,其主要功能是根据数据结构自动生成数据表的实体类(Entity)和数据操作类(Access)。 【描述】:“C#代码生成器源码,可根据数据结构生成数据表的实体(Entity),数据...

    C#自动生成.cs文件

    在C#编程中,自动生成.cs文件是一种常见的需求,它可以帮助开发者提高效率,减少重复劳动,尤其是在处理大量相似代码或需要遵循特定模板时。本文将深入探讨如何在C#环境中自动生成.cs文件,并涵盖相关技术点。 首先...

    dotnet-dotnetformat是dotnet的代码格式化程序

    6. **性能优化**:通过自动化代码格式化,可以减少手动调整代码格式的时间,让开发者更专注于业务逻辑的实现。 **总结** dotnet-format是.NET开发中一个非常实用的代码格式化工具,它能够帮助开发者保持代码的一致...

    CodeSmith.Pro.4.1.2 DotNet 代码生成工具

    。Net下的强大的代码生成工具 可以对实体类自动生存,自动与数据库映射

    dotnet 使用增量源代码生成技术的 Telescope 库导出程序集类型.rar

    例如,在数据绑定和接口实现中,Telescope库可以自动生成必要的代码,减少手动工作量。此外,当业务逻辑或界面设计发生变化时,增量源代码生成能确保仅更新相关的部分,而不会影响整个项目的编译速度。 在实际开发...

    dotnet-KalmanStudio开发辅助工具内置基于T4的代码生成器

    总结而言,dotnet-KalmanStudio凭借其内置的T4代码生成器,为.NET开发者提供了一个高效、灵活的工具,不仅能够根据数据库元数据自动生成代码,还能适应不同的开发框架和项目需求。通过深入学习和熟练运用,开发者...

    自动生成实体类....

    T4模板是一种代码生成技术,允许开发者编写模板,然后在编译时自动生成代码。 4. **手工编写但利用代码生成器辅助**:虽然手工编写实体类可能费时,但有些开发者会选择半自动化的方式,使用数据库设计工具导出表...

    dotnet-SoEasyPlatform一款轻量级开源的代码生成器

    同时,SoEasyPlatform的灵活性还体现在对数据库表结构的快速映射,能自动生成符合规范的代码,大大节省了编写数据访问层代码的时间。 在技术实现上,SoEasyPlatform所依赖的DLL组件均开源,可以在GitHub上获取源...

    Ascgen dotNET.rar

    Ascgen是一款知名的代码生成工具,尤其在.NET框架下,它为开发者提供了高效便捷的代码自动化生成服务。本文将深入探讨Ascgen在dotNET平台上的使用方法、功能特性以及其在实际开发中的重要性。 一、Ascgen简介 ...

    dotnet-微软开源的一种用于检测近似重复源代码的简单工具

    4. **报告生成**:生成详细的报告,列出所有近似重复的代码对,包括它们的相似度分数和位置信息。 5. **用户界面**:提供图形用户界面(GUI)或命令行接口(CLI),方便用户交互和自动化处理。 标签“.NET开发-其它...

    dotnet-TexturaCode是RoslynAPI的包装器用于生成保存和编译C代码

    这在动态构建代码库、自动生成测试代码或者实现元编程场景时,具有很高的价值。 `Textura.Code`中的主要功能包括但不限于以下几点: 1. **类生成**:你可以创建新的类,并为其指定命名空间、访问修饰符、基类和...

    dotnet-AutoUpdate基于WPF框架的自动更新软件

    总的来说,“dotnet-AutoUpdate”是.NET开发中的一个实用工具,它利用WPF的强大力量,简化了软件自动更新的实现过程。对于.NET开发者来说,掌握这样的工具和原理,有助于提升软件的生命周期管理和用户体验,同时也是...

    dotnet-dotnetscript用于从数据库表和视图中生成POCO类

    标题中的“dotnet-dotnetscript”是一个基于.NET的命令行工具,主要用于运行.NET脚本,而这个工具在描述中提到的特殊应用场景是从数据库的表和视图中自动生成POCO(Plain Old C# Object)类。POCO类是C#中一种简单的...

Global site tag (gtag.js) - Google Analytics