优德88app娱乐优德88app娱乐

w88官网
w88优德中文官方网站

动态实现空对象模式

您可以在 Github 上阅读本文。

动态空对象模式

空对象模式

关于空对象模式的介绍,请参考:

这里不对具体场景做样例描述,所以对场景做了抽象。

动态空对象程序包是基于 .NET Standard 开发的,可在 .NET Core 和 .NET Framework 4.5+ 项目中引用/使用。

场景类

public interface IFakeScenario { int ValueProperty { get; set; } object ReferenceProperty { get; set; } int GetValueObject(); object GetReferenceObject(); void SetObject(object obj); Task AsyncSetObject(object obj); Task<int> AsyncSetObjectReturnValue(object obj); Task<object> AsyncSetObjectReturnReference(object obj); }

添加动态空对象组件的引用

使用程序包管理控制台添加引用:

install-package NetSharp.DynamicNullObject

使用程序包管理器添加引用:

鼠标右键点击项目 => 管理 NuGet 程序包 => 浏览 => 输入 NetSharp.DynamicNullObject => 选择程序包 => 安装

其他方式请参考 NuGet 使用文档

使用组件

public static void Main(string[] args) { var emptyClassProvider = new EmptyClassProvider(); var emptyClass = emptyClassProvider.GetEmptyClass<IFakeScenario>(); var emptyObject = Activator.CreateInstance(emptyClass); var emptyScenario = (IFakeScenario)emptyObject; // 方法可正常调用,返回值是为对应类型的默认值 emptyScenario.SetObject("这是一个对象"); var value = emptyScenario.GetValueObject(); Console.WriteLine(value == 0); // true var reference = emptyScenario.GetReferenceObject(); Console.WriteLine(reference == null); // true // 异步方法总是返回一个异步操作,操作结果为对应类型的默认值 var task = emptyScenario.AsyncSetObject("这是一个对象"); Console.WriteLine(task.GetType() == typeof(Task<int>)); // true。对于无返回的任务,生成代码返回 Task.FromResult(0) var taskReturnValue = emptyScenario.AsyncSetObjectReturnValue("这是一个对象"); Console.WriteLine(taskReturnValue.GetType() == typeof(Task<int>)); // true Console.WriteLine(taskReturnValue.Result == 0); // true var taskReturnObject = emptyScenario.AsyncSetObjectReturnReference("这是一个对象"); Console.WriteLine(taskReturnObject.GetType() == typeof(Task<object>)); // true Console.WriteLine(taskReturnObject.Result == null); // true Action asyncAction = async () => { // 异步操作是正常可等待的,异步结果为对应类型的默认值 await emptyScenario.AsyncSetObject("这是一个对象"); var returnValue = await emptyScenario.AsyncSetObjectReturnValue("这是一个对象"); Console.WriteLine(returnValue == 0); // true var returnObject = await emptyScenario.AsyncSetObjectReturnReference("这是一个对象"); Console.WriteLine(returnObject == null); // true }; asyncAction(); // 属性是语法糖,对应 getter、setter 两个方法 emptyScenario.ValueProperty = 100; Console.WriteLine(emptyScenario.ValueProperty == 0); // true // 属性是语法糖,对应 getter、setter 两个方法 emptyScenario.ReferenceProperty = new object(); Console.WriteLine(emptyScenario.ReferenceProperty == null); // true Console.ReadKey(); }

更多

请自行挖掘...

欢迎阅读本文章: 何鹏

w88优德官网

w88官网