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 { } } }