• 动态实现空对象模式


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

    更多

    请自行挖掘...

  • 相关阅读:
    十三周课程总结
    第十二周课程总结
    第十一周课程总结
    第十周java总结
    第九周课程总结&实验报告(七)
    第八周课程报告&&实验报告六
    第七次学习总结&&第五次实验报告
    第六次学习总结&&第四次实验总结
    同余&逆元简单总结
    原根&离散对数简单总结
  • 原文地址:https://www.cnblogs.com/ideck/p/dynamicnullobject.html
Copyright © 2020-2023  润新知