c#委托的使用

325 阅读3分钟

C#委托的使用的简单demo

private delegate int DoCalculate(int A,int B); //1.声明一个委托
public void main(){
    string temp = "1";
    temp = textBox1.Text;
    DoCalculate doCalculate;//2.声明一个变量
    switch (temp)
    {
        case "1":
            doCalculate = new DoCalculate(add);//3.初始化变量,将方法作为参数传入
            break;
        case "2":
            doCalculate = new DoCalculate(sub);
            break;
        default:
            doCalculate = new DoCalculate(add);
            break;
    }
    //4.这边主要是想展示两种不同的调用方式
    //BeginInvoke是异步执行,Invoke同步执行,两者是c#自带的方法。
    if (temp.Equals("2"))
    { 
        doCalculate.BeginInvoke(1, 2, new AsyncCallback(AsyncOpert), null); //异步 回调方式进行调用
    }
    else
    {
        int a = doCalculate.Invoke(1, 2); //同步的方式
        MessageBox.Show(a.ToString());
    }
}
//被调用的两个方法
 public int add(int A, int B)
{
    return A + B;
}
public int sub(int A, int B)
{
    return A - B;
}
//回调函数
public void AsyncOpert(IAsyncResult resout)
{

    DoCalculate myDel = (DoCalculate)((AsyncResult)resout).AsyncDelegate;
    int j = myDel.EndInvoke(resout);
    ////  委托方法参数
    int[] lisNum = (int[])resout.AsyncState;
    MessageBox.Show(j.ToString());
}

JAVA委托的使用的简单demo
"委托”在C#中是一个语言级特性,而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托!

C#委托结合反射的使用
这种的使用场景是:当不同的参数个数或者参数类型不尽相同那么这时候就在调用委托方法时,那么这时候就在调用委托方法时,就不能简简单单的调用执行

这种情况在实际工作中场景举例:比如我们在使用缓存机制时候,都要使用到委托通反射相结合使用。

    /// <summary>
    /// Calculat类
    /// </summary>
    public class Calculat
    {
        /// <summary>
        /// 获取产品详情
        /// </summary>
        /// <param name="proKeyID">产品ID</param>
        /// <returns>获取结果</returns>
        public string GetProInfor(string proKeyID)
        {
            string proInfor = string.Empty;
            proInfor = ChachHelp.GetBusData<string>(new Func<string, string>(new ProBuss().GetProInfor), "proDetile" + proKeyID, 60000, proKeyID);
            return proInfor;
        }

        /// <summary>
        /// 获取用户常用产品
        /// </summary>
        /// <param name="userID">用户ID</param>
        /// <param name="cout">获取条数</param>
        /// <returns>获取结果</returns>
        public string GetCommonProInto(string userID, int cout)
        {
            string commonProInto = string.Empty;

            commonProInto = ChachHelp.GetBusData<string>(new Func<string, int, string>(new ProBuss().GetCommonProInto), "commonProInto" + userID, 60000, userID, cout);

            return commonProInto;
        }
    }

    /// <summary>
    /// 产品相关操作的业务逻辑处理
    /// </summary>
    public class ProBuss
    {
        /// <summary>
        /// 获取产品详情
        /// </summary>
        /// <param name="proKeyID">产品ID</param>
        /// <returns>获取结果</returns>
        public string GetProInfor(string proKeyID)
        {
            string proInfor = string.Empty;
            ////--- 
            //// 具体产品详情的逻辑处理
            ///---
            return proInfor;
        }

        /// <summary>
        /// 获取用户常用产品
        /// </summary>
        /// <param name="userID">用户ID</param>
        /// <param name="cout">获取条数</param>
        /// <returns>获取结果</returns>
        public string GetCommonProInto(string userID, int cout)
        {
            string commonProInto = string.Empty;

            ////--- 
            //// 获取用户常用产品的逻辑处理
            ///---

            return commonProInto;
        }
    }

    /// <summary>
    /// 缓存操作类
    /// </summary>
    public class ChachHelp
    {
        /// <summary>
        /// 获取缓存方法
        /// </summary>
        /// <typeparam name="T">返回数据类型</typeparam>
        /// <param name="dele">数据获取方法</param>
        /// <param name="cacheKey">缓存建</param>
        /// <param name="cacheDuration">缓存时间</param>
        /// <param name="objs">具体的参数集合</param>
        /// <returns>获取结果</returns>
        public static T GetBusData<T>(Delegate dele, string cacheKey, int cacheDuration, params object[] objs)
        {
            object obj = null;

            try
            {
                ///// obj =//// 具体调用缓存获取数据方法;
            }
            catch (Exception ex)
            {
                //// 吃掉异常
            }

            //// 如果缓存中没有获取到数据,那么就直接通过方法获取数据
            if (obj == null)
            {
                //通过反射获取对象信息
                string assemblyName = dele.Target.GetType().Assembly.FullName;
                string typeName = dele.Target.GetType().FullName;
                object instance = Assembly.Load(assemblyName).CreateInstance(typeName);
                MethodInfo methodInfo = dele.Method;

                obj = methodInfo.Invoke(instance, objs);
                if (obj != null)
                {
                    //// 在获取到数据后,应当将获取到数据,存储记得到缓存中去
                    //// 缓存存储具体方法逻辑
                }
            }

            //// 类型转换,将obj转换为对应的数据类型
            //// 此处先简略的直接用强制转换一波
            T tobj = (T)obj;
            return tobj;
        }
    }