zhang273162308 Unity实用小工具或脚本—利用反射制作动态编辑栏(三)

27
回复
1295
查看
打印 上一主题 下一主题
[ 复制链接 ]
排名
141
昨日变化

120

主题

562

帖子

6898

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
108
蛮牛币
5176
威望
0
注册时间
2013-9-10
在线时间
1483 小时
最后登录
2019-4-24

专栏作家活力之星游戏蛮牛QQ群会员蛮牛哥

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x

1、介绍

     上一篇中已经具备了将结构体实例利用反射动态的创建编辑栏的功能,本篇主要在前两篇的基础上增加了对泛型的处理以及无论是字段还是属性都可以进行处理功能。如图所示:


本篇里处理的泛型为List类型,定义的测试结构体为:

[C#] 纯文本查看 复制代码
[Serializable]
public struct Test
{
    public double Lon;
    public float Height;
    public double Lat;
    public void Init(double lon, float height, double lat)
    {
        Lon = lon;
        Height = height;
        Lat = lat;
    }
}
[Serializable]
public struct Test_Data1
{
    public int RouteID { get; set; }
    public int Number;
    public float Speed { get; set; }
    public int OffsetTime;
    public List<Test> ListData { get; set; }
}

其中Test_Data1结构体中,有字段也有属性,并且还有一个泛型ListData属性。这里要处理的是将前面四个字段和属性反射并生成编辑框的同时,还能动态的将ListData的数据信息也反射出来。

二、实现

       1、在我们还不知道结构体里面会不会有泛型数据的时候,首先就应该对反射出来的属性和字段都进行判断,判断是否为泛型通过,“IsGenericType”来判断。无论是结构体是属性还是字段,我们都可以反射出来,只需要增加一个循环处理。处理的方法“GetVaule_ReflectMethod”代码如下

[C#] 纯文本查看 复制代码
    /// <summary>
    /// 获取结构体非泛型的所有属性和字段,并返回由所有属性的名字和值组成的列表,Out 参数返回结构体或类中的泛型属性或字段
    /// (这里只处理类或结构体只有一个List这样的泛型字段或属性)的整个列表
    /// </summary>
    /// <typeparam name="S">结构体类型</typeparam>
    /// <typeparam name="L">结构体属性或字段列表中装载的数据类型</typeparam>
    /// <param name="obj">结构体实例</param>
    /// <param name="listGenericDatas">结构体属性或字段列表</param>
    /// <returns></returns>
    public static List<NP_SingleReflectInfo> GetVaule_ReflectMethod<S, L>(S obj, out List<L> listGenericDatas)
    {
        List<NP_SingleReflectInfo> tempList = new List<NP_SingleReflectInfo>();
        listGenericDatas = new List<L>();
        try
        {
            //遍历所有的属性
            PropertyInfo[] tempPI = obj.GetType().GetProperties();
            foreach (var info in tempPI)
            {
                //装载泛型属性
                if (info.PropertyType.IsGenericType)
                {
                    object tempListObj = info.GetValue(obj, null);
                    listGenericDatas = (List<L>)tempListObj;
                }
                else
                {
                    string tempVarName = info.Name;
                    string tempVarVaule = info.GetValue(obj, null).ToString();
                    NP_SingleReflectInfo tempData = new NP_SingleReflectInfo();
                    tempData.Init(tempVarName, tempVarVaule);
                    //装载信息到列表中
                    tempList.Add(tempData);
                }
            }
            //遍历所有的字段
            FieldInfo[] tempFI = obj.GetType().GetFields();
            foreach (var itemInfo in tempFI)
            {
                //装载泛型字段
                if (itemInfo.FieldType.IsGenericType)
                {
                    object tempListObj = itemInfo.GetValue(obj);
                    listGenericDatas = (List<L>)tempListObj;
                }
                else
                {
                    string tempVarName = itemInfo.Name;
                    string tempVarVaule = itemInfo.GetValue(obj).ToString();
                    NP_SingleReflectInfo tempData = new NP_SingleReflectInfo();
                    tempData.Init(tempVarName, tempVarVaule);
                    //装载信息到列表中
                    tempList.Add(tempData);
                }
            }
        }
        catch (Exception e)
        {
            Debug.Log("获取类型数据错误" + e.Message);
            return null;
        }

        return tempList;
    }

属性和字段都分开处理,并将得到的字段和属性的两个重要信息“名字”和“值”装载成一个List返回,该List的结构体为:

[C#] 纯文本查看 复制代码
/// <summary>
/// 反射获得结构体、类中的单个变量或属性的名字和值
/// </summary>
[Serializable]
public struct NP_SingleReflectInfo
{
    /// <summary>
    /// 变量的名字
    /// </summary>
    public string VariableName;
    /// <summary>
    /// 变量的值
    /// </summary>
    public string VariableValue;
    public void Init(string name, string value)
    {
        VariableName = name;
        VariableValue = value;
    }
}

GetVaule_ReflectMethod”集中的将一个结构体中的非泛型的字段和属性进行处理,将它们的名字和值都统一处理。如代码:

[C#] 纯文本查看 复制代码
testData1.ListData = new List<Test>();

        Test t1 = new Test();
        Test t2 = new Test();
        t1.Init(10, 20, 30);
        t2.Init(0.2, 0.45f, 0.67);
        testData1.ListData.Add(t1);
        testData1.ListData.Add(t2);
        listSingleReflectInfo = GetVaule_ReflectMethod(testData1, out listRelctInfoListData);

        //然后根据这些字段创建一个ui编辑条
        for (int i = 0; i < listSingleReflectInfo.Count; i++)
        {
            UI2D_SubObjEditorAttr tempEPPA = Instantiate(prefabSubObjEditor);
            tempEPPA.transform.SetParent(transform);
            tempEPPA.transform.localPosition = new Vector3(0, -intervalHeight * i, 0);
            tempEPPA.transform.localScale = Vector3.one;
            tempEPPA.Init(null, listSingleReflectInfo[i].VariableName, listSingleReflectInfo[i].VariableValue);
        }


GetVaule_ReflectMethod”的方法返回了一个List列表“listSingleReflectInfo”,列表里装载的就是结构体“Test_Data1”实例“testData1”中的所有非泛型字段或属性的名字和值。另外,GetVaule_ReflectMethod”方法还有一个Out参数“out List<L> listGenericDatas”,该参数是将结构体中的泛型数据提取出来。

2、完整的代码:

游客,如果您要查看本帖隐藏内容请回复

三、总结

1、对于结构体里的泛型数据进行了处理,得到了该泛型数据

2、无论是字段还是属性都可以处

3、 工程下载地址.txt (116 Bytes, 下载次数: 13, 售价: 5 蛮牛币)




参与人数 1鲜花 +5 收起 理由
火卡 + 5 很给力!

查看全部评分总评分 : 鲜花 +5

8常驻蛮牛
5066/10000
排名
428
昨日变化

4

主题

2449

帖子

5066

积分

Rank: 8Rank: 8

UID
182740
好友
2
蛮牛币
9058
威望
0
注册时间
2016-11-10
在线时间
987 小时
最后登录
2019-4-24
沙发
2019-3-18 18:46:39 只看该作者
谢谢分享啊!!!
7日久生情
1744/5000
排名
1366
昨日变化

2

主题

154

帖子

1744

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
148089
好友
0
蛮牛币
2663
威望
0
注册时间
2016-5-10
在线时间
680 小时
最后登录
2019-4-22
板凳
2019-3-18 19:21:51 只看该作者
6666666666666666666666666
7日久生情
1637/5000
排名
4093
昨日变化

0

主题

988

帖子

1637

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蛮牛币
1546
威望
0
注册时间
2017-11-16
在线时间
287 小时
最后登录
2019-4-24
地板
2019-3-19 08:36:15 只看该作者
6666666666666666666666666666
7日久生情
3403/5000
排名
123
昨日变化

0

主题

174

帖子

3403

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
6304
好友
0
蛮牛币
7892
威望
0
注册时间
2013-10-24
在线时间
789 小时
最后登录
2019-4-24
5#
2019-3-19 09:27:08 只看该作者
不错....感谢分享..
6蛮牛粉丝
1224/1500
排名
1761
昨日变化

0

主题

147

帖子

1224

积分

Rank: 6Rank: 6Rank: 6

UID
188322
好友
0
蛮牛币
4210
威望
0
注册时间
2016-11-30
在线时间
325 小时
最后登录
2019-4-24
6#
2019-3-19 09:45:30 只看该作者
谢谢 楼主分享   
6蛮牛粉丝
1032/1500
排名
16954
昨日变化

1

主题

693

帖子

1032

积分

Rank: 6Rank: 6Rank: 6

UID
199204
好友
1
蛮牛币
561
威望
0
注册时间
2017-1-5
在线时间
298 小时
最后登录
2019-4-24
7#
2019-3-19 09:48:13 只看该作者
谢谢分享
3偶尔光临
283/300
排名
12674
昨日变化

0

主题

124

帖子

283

积分

Rank: 3Rank: 3Rank: 3

UID
289410
好友
0
蛮牛币
26
威望
0
注册时间
2018-7-11
在线时间
87 小时
最后登录
2019-4-15
8#
2019-3-19 12:17:42 只看该作者
9999999999999999999999
排名
14743
昨日变化

0

主题

6

帖子

89

积分

Rank: 2Rank: 2

UID
312180
好友
0
蛮牛币
110
威望
0
注册时间
2019-1-19
在线时间
29 小时
最后登录
2019-4-24
9#
2019-3-19 13:45:39 只看该作者
666666666666
5熟悉之中
747/1000
排名
3601
昨日变化

0

主题

96

帖子

747

积分

Rank: 5Rank: 5

UID
71644
好友
0
蛮牛币
1260
威望
0
注册时间
2015-1-28
在线时间
235 小时
最后登录
2019-4-24
10#
2019-3-19 14:27:26 只看该作者
谢谢分享啊!!!
8常驻蛮牛
7613/10000
排名
251
昨日变化

0

主题

3915

帖子

7613

积分

Rank: 8Rank: 8

UID
3215
好友
0
蛮牛币
164
威望
0
注册时间
2013-9-4
在线时间
1702 小时
最后登录
2019-4-16
11#
2019-3-19 20:25:51 只看该作者
哒哒哒哒哒哒多多多多多多多
排名
48129
昨日变化

0

主题

14

帖子

27

积分

Rank: 1

UID
317153
好友
0
蛮牛币
5
威望
0
注册时间
2019-3-20
在线时间
9 小时
最后登录
2019-4-3
12#
2019-3-20 01:26:20 只看该作者
1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
5熟悉之中
740/1000
排名
8914
昨日变化

0

主题

422

帖子

740

积分

Rank: 5Rank: 5

UID
36289
好友
0
蛮牛币
9
威望
0
注册时间
2014-7-25
在线时间
186 小时
最后登录
2019-4-18
13#
2019-3-20 08:51:08 只看该作者
Unity实用小工具或脚本—利用反射制作动态编辑栏
7日久生情
1707/5000
排名
1990
昨日变化

5

主题

515

帖子

1707

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
54335
好友
2
蛮牛币
5529
威望
0
注册时间
2014-11-9
在线时间
505 小时
最后登录
2019-4-24
14#
2019-3-20 09:03:08 只看该作者
利用反射制作动态编辑栏
3偶尔光临
285/300
排名
12477
昨日变化

0

主题

76

帖子

285

积分

Rank: 3Rank: 3Rank: 3

UID
313384
好友
0
蛮牛币
552
威望
0
注册时间
2019-2-4
在线时间
135 小时
最后登录
2019-4-24
15#
2019-3-20 13:35:45 只看该作者
好的。。。
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则