连贯接口 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
            {

            }
        }


    }
原文地址:https://www.cnblogs.com/wangchuang/p/2984506.html