• 连贯接口 fluent interface


    public class Currency
        {
            /// <summary>
            /// 货币代码
            /// </summary>
            public string Code { get; set; }
    
            /// <summary>
            /// 货币名称
            /// </summary>
            public string Name { get; set; }
        }
    
        public interface IDataFacade
        {
            /// <summary>
            /// 根据筛选条件执行查询
            /// </summary>
            /// <param name="filter">筛选条件委托</param>
            /// <returns>查询结果</returns>
            IEnumerable<Currency> ExecuteQuery(Func<Currency, bool> filter);
    
            /// <summary>
            /// 追加新的货币记录
            /// </summary>
            /// <param name="code">货币代码</param>
            /// <param name="name">货币名称</param>
            /// <returns>连贯对象实例</returns>
            /// <remarks>连贯接口方法</remarks>
            IDataFacade AddNewCurrency(string code, string name);
        }
    注意此处返回的是一个 接口,一个对象实例不一定是自身,是自身的一个抽象,还有注意一点是
    Func<Currency, bool> filter这样的运用,具体可查阅相关资料
    
    

    实现接口

    /// <summary>
        /// 连贯接口的实现类
        /// </summary>
        public class CollectionDataFacade : IDataFacade
        {
            IList<Currency> data = new List<Currency>();
    
            public IEnumerable<Currency> ExecuteQuery(Func<Currency, bool> filter)
            {
                return filter == null ? data : data.Where(filter);
            }
    
            public IDataFacade AddNewCurrency(string code, string name)
            {
                if (string.IsNullOrEmpty(code)) throw new ArgumentNullException("code");
                if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
                data.Add(new Currency() {Code = code, Name = name});
                return this;
            }
        }
    这里返回的是
    IDataFacade 导致可以连贯调用这么个方法

    
    

    调用

     [TestMethod]
            public void TestFluentInterface()
            {
                IDataFacade facade = new CollectionDataFacade();
                var currentRows = facade.ExecuteQuery(null).Count();
                
                //  连续添加记录
                facade
                    .AddNewCurrency("CNY", "人民币元")
                    .AddNewCurrency("USD", "美元")
                    .AddNewCurrency("JPY", "日圆")
                    .AddNewCurrency("HKD", "港元")
                    .AddNewCurrency("FRF", "法郎")
                    .AddNewCurrency("GBP", "英镑");
    
                Assert.AreEqual<int>(currentRows + 6, facade.ExecuteQuery(null).Count());
    
                //  连续添加记录
                facade
                    .AddNewCurrency("DW1", "Known1")
                    .AddNewCurrency("DW2", "Known2")
                    .AddNewCurrency("DW3", "Known3")
                    .AddNewCurrency("DW4", "Known4")
                    .AddNewCurrency("DW5", "Known5");
                Assert.AreEqual<int>(5, facade.ExecuteQuery((x) => { return x.Code.StartsWith("DW"); }).Count());
            }

    可以连续点出来这个方法因为它返回的一个实例,另外一个要注意的是
    Func<Currency, bool> filter  =
    (x) => { return x.Code.StartsWith("DW"); }  x代表参数就是
    Currency类型,返回一个bool值,对应bool,简单的说就是传入的参数是第一个,后面一个是返回的值
    既然说到这个,就直接选取一个例子给大家做说明
    
    

    Func<>用法

    class Program
        {
            static void Main(string[] args)
            {
                //类似委托功能
                Func<string, int> test = TsetMothod;
    
                Console.WriteLine(test("123"));
    
                Func<string, int> test1 = TsetMothod;
    
    
                //只需要调用这个类就可以减少重复的代码
                CallMethod<string>(test1,"123");
    
                //或者采用这种
                CallMethod<string>(new Func<string, int>(TsetMothod), "123");
    
                CallMethod(new Func<string, int>(TsetMothod), "123");
    
    
                
            }
    
           
            public static int TsetMothod(string name)
            {
                if (string.IsNullOrEmpty(name))
                {
                    return 1;
                }
                return 0;
    
            }
    
            //改造经常出现类似代码下面
    
            //try
            //{
            ////Do();只有这个方法改变
            //}
            //catch (System.Exception ex)
            //{
            //    //Log(e);
            //}
            //finally
            //{
            ////DoOther();
            //}
    
            //
            public static void CallMethod<T>(Func<T,int> func,T item)
            {
                try
                {
                   int i= func(item);
                   Console.WriteLine(i);
                }
                catch(Exception e)
                {
    
                }
                finally
                {
    
                }
            }
    
    
        }
  • 相关阅读:
    表的外键创建:
    django内容回顾:
    编辑出版社:
    删除出版社:
    新增出版社:
    Windows XP SP3中远程桌面实现多用户登陆
    Hibernate基本概念 (4)
    Hibernate基本概念 (3)
    Hibernate基本概念 (3)
    Hibernate基本概念 (3)
  • 原文地址:https://www.cnblogs.com/wangchuang/p/2984506.html
Copyright © 2020-2023  润新知