有一个方法如:private void methodA()
{
方法开始时间 DateTime.Now;//逻辑运算方法结束时间 DateTime.Now;//方法一共使用的时间
结束时间-开始时间
}现在需要对很多方法进行写日志.每一个方法都需要计算开始时间和结束时间。怎么才能重构一个
方法出来,让逻辑运算以外的独立出来.
谢谢了..

解决方案 »

  1.   

    使用委托:private void methodA(Action todo)
    {
    方法开始时间 DateTime.Now;todo();方法结束时间 DateTime.Now;//方法一共使用的时间
    结束时间-开始时间}调用:
    定义一个方法:
    void dosth()
    {
        //逻辑运算
        ...
    }
    调用,传入方法
    methodA(dosth);
      

  2.   

    在问一下,每个方法不一样的,如有返回值的.
    private int MethodA()
    {}
    private DateSet MethodB()
    {}还有int,xml之类的,那是不是需要很多个委托?
      

  3.   

    本帖最后由 caozhy 于 2012-10-23 20:25:23 编辑
      

  4.   

    参数的话,可以使用object数组。
      

  5.   

    Stopwatch watch = new Stopwatch();   
    watch.Start();   
    //方法watch.Stop();   
    Console.WriteLine("执行时间为:{0}秒", watch.ElapsedMilliseconds / 1000.0f);   
      

  6.   

    1.一楼的方法不具有可操作性,楼主只是举了个例子,实际上方法的签名五花八门,
      不仅有Action(in T),Action(T1,T2.......)还有func(in T,out t)
      如果要用委托的话,写死人了,还不如楼主的代码方便;
    2.楼主参照7楼的写法,不要把不属于方法本身职责的处理写在方法中;
    3.如果楼主有勇气颠覆一下整个开发方式
      可以考虑统一描述方法,也就是对象化方法,比如这样:
    public interface IMethod{
        public Collection<MethodParam> Params;
        public string uid;
        public string Name;
        public object Execute();
        }
       但是这种思路,对于主要靠手工编写代码的开发者也很难实施
      

  7.   

    9L说对了,的确每个方法的参数都不一样,有int,sting,out,ref之类的,如果用委托是比较实现,现在项目上需要要将调用了任何方法的信息(方法名,方法使用时间,是否成功,错误信息等全部写到数据库).定义一个实体类,将这些参数传到实体内,然后在插入数据库.
    几百个方法都需要写同样的代码.手工编码,如果哪天需要修改的话,就快不想活了..
      

  8.   

    使用泛型委托的话,写十几个足够了。事实上,微软定义的Func<T1> Func<T1, T2> ... Func<T1, T2, T3, T4, ... T16>足够涵盖99.999%的情况,实际上大多数函数的参数都少于16个。
      

  9.   

    注意,你不需要排列组合所有的参数类型,只要用泛型就可以了,比如
    Func<T1, T2, T3> (考虑协变和逆变,应该是 Func<in T1, in T2, out T3>),可以涵盖所有两个参数的方法,比如
    int foo1(string x, double y) => Func<string, double, int>
    string foo2(string x, string y) => Func<string, string, string>
    string[] split(string source, char splitter)
    => Func<string, char, string[]>
    ...
    以此类推
      

  10.   

    如果是项目中需要,我个人会采用AOP方式解决加入特性标注,找个IL织入工具,在编译期方法拦截织入7楼代码,这样做更改做少当然委托 或动态代理也可以解决,只是代码变动比较大
      

  11.   

    我会用using来解
    public class Swatch : IDisposable { public Swatch() {
    w = new Stopwatch();
    w.Start();
    } public Swatch(SwatchCompletedHandler handler)
    : this() {
    this.handler = handler;
    } public Swatch Enable(bool enable = true) {
    this.enable = enable;
    return this;
    } public void Dispose() {
    w.Stop();
    if (handler != null && enable) { handler(w.Elapsed); }
    } private bool enable;
    private SwatchCompletedHandler handler;
    private Stopwatch w;
    }public delegate void SwatchCompletedHandler(TimeSpan elapsed);
    调用如下,using (new Swatch(t => MessageBox.Show(t.ToString())).Enable()) {
    Load();
    }
    代码可以这里下载,http://nonocast.cn/using-stopwatch/May it helps.
      

  12.   

    嗯,我考虑过using,甚至考虑过try finally ,不过都需要手动变动现有代码所以最终使用IL植入类AOP工具了,这个逻辑相对简单,让机器植入IL我到比较放心,如果逻辑复杂了我会考虑代理类自己控制了
      

  13.   

    看到大家的回复,非常感谢,不过很多东西我都需要理解一下。 wanghui0380是否能帮我找一个c# AOP织入的范例?
      

  14.   

    http://www.cnblogs.com/leoo2sk/archive/2010/11/30/aop-postsharp.html这里有一遍静态织入工具postsharp的入门资料,而且刚刚好滴是博主本身的例子就一个和你很类似的日志系统的实现
      

  15.   

            public static void doMethod(Action method)
            {
                Stopwatch time = new Stopwatch();
                time.Start();
                method();
                time.Stop();
                Console.WriteLine(time.Elapsed.TotalSeconds);
            }
            public static valueType doMethod<valueType>(Func<valueType> method)
            {
                Stopwatch time = new Stopwatch();
                time.Start();
                valueType value = method();
                time.Stop();
                Console.WriteLine(time.Elapsed.TotalSeconds);
                return value;
            }
                string upper = "ABC", lower = doMethod(() => upper.ToLower());
                string numberString = "123";
                int number = 0;
                if (doMethod(() => int.TryParse(numberString, out number)))
                {
                    List<int> list = new List<int>();
                    doMethod(() => list.Add(number));
                    doMethod(list.Clear);
                }只是演示一下,除非是临时性的,个人不建议这样使用。如果出现这种应用,应该考虑一下重新设计底层了。
      

  16.   

    我使用了 wanghui0380 介绍的方法,面向切面,根据例子在winform已经可以正常写日志,实际上我是需要记录webservice提供的方法。但是在webservice中无法记录,是不是在asp.net中无法使用这种方法呢?
      

  17.   

    我用过企业库来做aop切面,记录业务日志。
    LZ可以去找找微软企业库。