简单的UI框架 | 六、开发字典扩展类

简单的UI框架 | 六、开发字典扩展类,第1张

简单的UI框架

开发字典扩展类

字典扩展类

目前我们在字典中取一个东西需要两步,第一步先定义这个东西的类型,第二步TryGetValue

        BasePanel panel;
        panelDict.TryGetValue(panelType, out panel);

这样做比较麻烦,所以我们接下来建立一个拓展类。
建立一个新的脚本DictionaryExtension字典拓展类。

public static class DictionaryExtension
{

}

字典类是系统内置的类,我们进行扩展的时候首先要要声明为static,扩展类必须是一个静态的方法。
我们要定义一个方法,得到一个东西,所以需要返回值,但是我们不知道返回值类型是什么,所以先定义为void。

public static void TryGet<Tkey,Tvalue>(this Dictionary<Tkey,Tvalue> dict,Tkey key)
{

}

TryGet方法是用来尝试根据key得到value,得到的话直接返回value,没有得到直接返回null。
首先有一个this对象,它代表定义的字典对象。这里字典的类型我们也不知道,所以这里我们给这个方法声明两个泛型

TryGet<Tkey,Tvalue>

所以字典类型为

this Dictionary<Tkey,Tvalue> dict

我们声明的这个TryGet方法是给一个字典对象调用的,这个字典对象我们现在并不知道,如果这个方法是直接定义在字典里面的,我们直接可以通过this获得当前对象。但现在我们的拓展方法是定义在字典的外面的,现在我们就可以声明这样一个参数,这个参数代表我们调用方法的时候的那个对象,既这个字典表示我们要获取值的字典。
接下来我们要通过Key来获取值,这里我们定义为

Tkey key

接下来TryGet内部

public static void TryGet<Tkey,Tvalue>(this Dictionary<Tkey,Tvalue> dict,Tkey key)
{
        Tvalue value;
        dict.TryGetValue(key, out value);
        return value;
}

首先定义一个value,然后调用TryGetValue方法来获取值,直接return,得到直接返回value,没得到直接返回null。
所以现在我们知道了返回值是什么类型的,为Tvalue类型,所以我们整个扩展类中的代码为

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class DictionaryExtension
{

    public static Tvalue TryGet<Tkey,Tvalue>(this Dictionary<Tkey,Tvalue> dict,Tkey key)
    {
        Tvalue value;
        dict.TryGetValue(key, out value);
        return value;
    }
}

接下来我们回到UIManager脚本。
所以我们可以直接调用这个扩展方法。

        //BasePanel panel;
        //panelDict.TryGetValue(panelType, out panel);

        BasePanel panel = panelDict.TryGet(panelType);

调用方法直接把key传过去就可以了,key为panelType。
接下来的if语句中也可以相应更改。

if (panel == null)
        {
            //string path;
            //panelPathDict.TryGetValue(panelType, out path);
            string path = panelPathDict.TryGet(panelType);
            GameObject instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject;
            instPanel.transform.SetParent(canvasTransform);
            panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
            return instPanel.GetComponent<BasePanel>();
        }
        else
        {
            return panel;
        }

有一个疑问,这里的TryGet不是一个泛型吗?为什么这里不需要指明泛型的类型呢?
因为我们是通过一个字典对象调用的,这个字典对象他的Key和Value已经是确定的,所以你通过字典对象去调用TryGet这个方法的时候,这个Tkey和Tvalue就根据字典对象的Key和Value决定的,这个字典对象就相当于TryGet方法参数中的this对象,所以这个this对象是不需要我们赋值的。

总结

今天我们建立了一个字典的扩展类,方便我们之后的使用。
扩展类的定义也是C#自带的语法。
扩展方法的 3 个要求:
1、声明扩展方法的类必须声明为 static;
2、扩展方法本身必须声明为static;
3、扩展方法第一个参数类型前一定要包含关键字 this
同时扩展方法也可以和泛型一起使用。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/797825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存