进步的途径

/// <summary>
/// 获取列表(任意entity,尽量少的字段)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
public static List<T> FindListBySql<T>(string sql, string dbname) where T : new()
{
    List<T> list = new List<T>();
    object obj;
    IDataReader rd = null;
    try
    {
        rd = RunReader(sql, dbname);

        if (typeof(T) == typeof(int))
        {
            while (rd.Read())
            {
                list.Add((T)rd[0]);
            }
        }
        else if (typeof(T) == typeof(string))
        {
            while (rd.Read())
            {
                list.Add((T)rd[0]);
            }
        }
        else
        {
            IList propertyList = ReflectionUtil.GetPropertyList(typeof(T));

            int fcnt = rd.FieldCount;
            List<string> fileds = new List<string>();
            for (int i = 0; i < fcnt; i++)
            {
                fileds.Add(rd.GetName(i).ToUpper());
            }

            while (rd.Read())
            {
                IDataRecord record = rd;
                obj = new T();

                foreach (PropertyInfo pro in propertyList)
                {
                    if (!fileds.Contains(pro.Name.ToUpper()) || record[pro.Name] == DBNull.Value)
                    {
                        continue;
                    }

                    if (rft.IsInterface(pro.PropertyType, typeof(IEntity)))
                    {
                        if (record[pro.Name].GetType() == typeof(int))
                        {
                            IEntity subOjb = ndb.findById(pro.PropertyType, (int)record[pro.Name]);

                            if (rft.IsInterface(obj.GetType(), typeof(IEntity)))
                            {
                                ((IEntity)obj).set(pro.Name, subOjb);
                            }
                            else
                            {
                                pro.SetValue(obj, Convert.ChangeType(subOjb, pro.PropertyType), null);
                            }
                        }
                    }
                    else
                    {
                        pro.SetValue(obj, record[pro.Name] == DBNull.Value ? null : getReaderValue(record[pro.Name], pro.PropertyType), null);
                    }
                }
                list.Add((T)obj);
            }
        }
    }
    catch (Exception ex)
    {
        logger.Error("sql=>" + sql);
        logger.Error(ex.Message);
        logger.Error(ex.StackTrace);
        throw ex;
    }
    finally
    {
        if (rd != null && !rd.IsClosed)
        {
            rd.Close();
        }
    }
    return list;
}

从上面这段代码说起。

这段代码是我们项目经理写的,我看了一会,了解了其中的逻辑,但代码不能调试,了解的不是很透彻。

看了这段代码之后,我感觉我和项目经理在技术的差距就在这里。我虽然也能看懂,研究过后,我也能写一个出来,但体现水平的地方不在这里。我们的项目用了第三方的MVC框架,这个函数有的地方没有直接用C#反射相关的类,而是用了框架中封装的类,这就说,项目经理不是完全自己写一个东西出来,而是在看懂了框架的基础上,写出的这段代码。而项目经理不可能有大量空闲时间研究框架,最多也就几个星期的时间。在较短的时间内看懂一个第三方框架,并能在它的基础上扩展出需要的东西,这才是体现水平的地方!也是我现在不具备的技术能力。

我以前也写过一些相对有些技术含量的东西,但是,它们有一个特点,100%原创,即使原本有别人的东西,我也会把它重写,变成自己的。中国人有一个优点,特别擅长逆向工程,为什么我就没有这个优点呢!我想仅从技术上讲,公司需要这样的人,一个新项目,一个新框架,但框架并不完美,是有局限的,你能不能在其它员工开工前,短短的时间内,把框架读懂,把框架中缺少的东西,需要改进的东西或者需要根据项目实际需求修改的东西做出来呢?

昨天,我又看了一会我2010年,刚毕业那会写的代码,代码写的真烂,真让人抓狂!不过我想做为一个刚毕业不久的员工来说,只要领导的设计没有偏差,项目也不会因为我那些烂代码而失败的。看到那些代码,我想项目经理是不是有些失职呢?对员工的代码审查还是很重要的,尤其是工作时间不长的员工。不过话又说回来,正是这些很烂、很疯狂、很无知的代码,才使得我现在写这类代码能够游刃有余,达到炉火纯青的地步。后来,我觉得我是不是步入了歧途,所以不再写那样的代码,变得中规中矩,不再冒险,我在这方面的水平也就止步于此了!

为什么我还达不到项目经理的水平呢?除了自己的悟性之外,因为我还没有在框架方面折腾过,还没有像我以前写页面功能那样,写过很多烂代码。不搞出过几个烂框架出来,不做烂几个项目,水平怎么上来呢?

回头再看上面那段代码,在更强的高手眼里,(用词忘了),其实我看懂了之后,也觉得没有什么。但如果没有这段代码,我想恐怕我是写不出来吧,或者根本就不知道写这个东西,或许意味着项目中要多写很多代码。(2014年9月6日0时5分)(2014年9月6日1时54分)

时间: 2024-10-06 03:08:47

进步的途径的相关文章

实现软件定义网络(SDN)的6种途径

尽管围绕软件定义网络(SDN)的所有兴奋点都是由OpenFlow刺激起来的,但实际上利用各种标准工具对网络进行编程已经有一段时间了.OpenFlow并非实现SDN的唯一方法或者唯一途径.就目前而言,要想实现SDN,除了OpenFlow以外,至少还有6种方法或途经. 命令行接口(CLI) CLI是交换机和路由器的常用接口,网络经理们常用它来配置交换机,激活或者禁用某些服务. Arista网络的CEO Jayshree Ullal说,"要想开放,不只有一种方法.要想扩展,也不只一种方法.CLI虽然不

网上常见入侵的六种途径

你作为一个精明的电脑用户,除了必须了解各种恶意软件的入侵途径外,还需对其常见的入侵加以防御,才可保护电脑及财产的安全.下面来看看网上常见入侵的几种途径. 一.通过通讯软件感染病毒 近几年来,通过QQ.Yahoo! Messenger.Window等通讯软件传播病毒速率,成急剧增加的趋势.那究竟什么原因导致这个现象产生呢?其实答案很简单,就是IM软件支持了查看脱机信息. 在程序的主界面内,依次单击上方"工具"→"选项",在弹出的"选项"对话框内,选

GridView控件RowDataBound事件中获取列字段值的几种途径 !!!

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes.Add("onclick", "javascript:alert('当前ID为:" +DataBinder.Eval(e.Row.DataItem,"CID"

美术教师观念、角色转变的途径

1 美术教师观念-角色转变的必要性 推进素质教育,培养学生具有完善健全的人格.德智体全面发展的复合型的人才是当代人才教育培养的最终目标.美术教育在素质教育中,可以通过它特有的艺术训练,丰富学生的生活经验,陶冶学生的思想情操,提高学生的审美和鉴赏能力.因此,在新时期的教育中,应加强各学科间的横向结合,以美术为切入点,寻找各学科之间的交汇点,实现综合效应. 随着全球化.网络化.信息化的飞速发展,"开放教育"和"终身教育"已成为当代教育的两个主要的特征,在新的环境条件下,

免费的学习途径有哪些?

既然选择了程序员这条道路,自然就免不了要不断的学习,正所谓学习无止境,技术永创新.学习的途径有很多,总的来说无非两种:一种是收费的,另一种是免费的.我自然会选免费的学习途径了.下面就是我搜集的一些学习途径,和园友们一起分享下. 第一种:免费的视频. 视频的优点就是简单明了,可以边看边学,生动有趣,方便快速进入学习状态.我在计算机方面的知识,大都是通过看视频入门的.最早学asp的时候,是看的网易视频,我至今还记得是一个叫FIF小组的视频.php是看的李炎恢和php100上面的视频,css也是李炎恢

喜欢计算机的孩子们啊,勇敢地攀登,是登顶的唯一途径!

我小学二年级接触数学竞赛,四五年级接触计算机竞赛,现在计算机系大三,关键这条路还是我自己选的,你肯定就知道我对数学和计算机感情多深了. 小学数学风生水起,到中学勉强双一保送,再到如今大学生活平平,身边人大都见证了我的颓废,而我自己觉得呢?颓废是颓废,可更准确地说,其实是迷茫. 数学好玩,我小时候一直这么觉得:数学没意思,计算机好玩,这是我中学的想法:如今,我觉得它们都好玩,只可惜自己走了弯路. 于是,愚蠢的我在奋斗的路上手忙脚乱.但正因我忙,我更想挤出时间把自己走的弯路记录下来,但愿后人别走我的

Android源代码查看途径

作为一个android coder,多阅读android源码对提高android开发水平是很有帮助的,那么我们可以通过哪些途径查看android源码呢 1.如果你能够FQ的话可以去android官网查看源码 http://developer.android.com/reference/packages.html 2.http://androidxref.com/5.0.0_r2/ androidxref 还可以查看android的所有版本,只需将 http://androidxref.com/5

GridView 获取列字段的几种途径

GridView是ASP.NET中功能强大的数据显示控件,它的RowDataBound事件为我们提供了方便的控制行.列数据的途径. 要获取当前行的某个数据列,我在实践中总结有如下几种方法: 1. Cells[x].Txt. 从列单元格的文本值获取.这种方法简单高率,最为常用,但是功能单纯.此法存在几个缺点: (1)无法获取到设置了隐藏属性的数据列的值,所取到的值为“”(空). (2)只能获取在HTML中定义过的数据列,无法查询数据源中的当前数据行的所有字段列.一般情况下,通过HTML设置Grid

独辟蹊径之android程序完全退出的一种途径

最近做一个项目时,意外发现了一种可以让android程序完全退出的一种途径,遥想当年为了找到一种有效地途径让android程序完全退出时的窘迫,不由得有些感慨.这里不敢独享,和大家分享一下,也是抛砖引玉,希望有大牛出来继续探讨一下这个问题. 方法很简单,其实就是一层窗户纸,知道了,就明白了.用jni调用linux系统调用exit即可.下面给出具体实现: package com.example.bitmaptest; import android.util.Log; public final cl

怎样判断iOS App是通过哪种途径启动的?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions说明:当应用程序启动时执行,应用程序启动入口.只在应用程序启动时执行一次.application参数用来获取应用程序的状态.变量等,值得注意的是字典参数:(NSDictionary *)launchOptions,该参数存储程序启动的原因.1.若用户直接启动,lauchOptions