动态实现空对象模式

您可以在 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();
    }

更多

请自行挖掘...

posted @ 2018-07-29 03:00  饶春江  阅读(374)  评论(0编辑  收藏  举报