找回密码
 注册帐号

扫一扫,访问微社区

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

35
回复
2269
查看
[ 复制链接 ]
排名
141
昨日变化

123

主题

574

帖子

6948

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
110
蛮牛币
5240
威望
0
注册时间
2013-9-10
在线时间
1518 小时
最后登录
2019-7-23

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

2019-3-18 18:10:21 显示全部楼层 阅读模式

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

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

x

1、介绍

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

ff.gif

本篇里处理的泛型为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, 下载次数: 21, 售价: 5 蛮牛币)

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

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

回复

使用道具 举报

8常驻蛮牛
5117/10000
排名
427
昨日变化

4

主题

2462

帖子

5117

积分

Rank: 8Rank: 8

UID
182740
好友
2
蛮牛币
9269
威望
0
注册时间
2016-11-10
在线时间
1025 小时
最后登录
2019-7-21
2019-3-18 18:46:39 显示全部楼层
谢谢分享啊!!!
回复

使用道具 举报

7日久生情
1786/5000
排名
1365
昨日变化

2

主题

161

帖子

1786

积分

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

UID
148089
好友
0
蛮牛币
2682
威望
0
注册时间
2016-5-10
在线时间
715 小时
最后登录
2019-7-22
2019-3-18 19:21:51 显示全部楼层
6666666666666666666666666
回复 支持 反对

使用道具 举报

7日久生情
1989/5000
排名
4092
昨日变化

0

主题

1285

帖子

1989

积分

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

UID
254705
好友
1
蛮牛币
1823
威望
0
注册时间
2017-11-16
在线时间
342 小时
最后登录
2019-7-23
2019-3-19 08:36:15 显示全部楼层
6666666666666666666666666666
回复 支持 反对

使用道具 举报

7日久生情
3452/5000
排名
123
昨日变化

0

主题

174

帖子

3452

积分

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

UID
6304
好友
0
蛮牛币
8259
威望
0
注册时间
2013-10-24
在线时间
838 小时
最后登录
2019-7-22
2019-3-19 09:27:08 显示全部楼层
不错....感谢分享..
回复

使用道具 举报

6蛮牛粉丝
1314/1500
排名
1761
昨日变化

0

主题

174

帖子

1314

积分

Rank: 6Rank: 6Rank: 6

UID
188322
好友
0
蛮牛币
4374
威望
0
注册时间
2016-11-30
在线时间
388 小时
最后登录
2019-7-23
2019-3-19 09:45:30 显示全部楼层
谢谢 楼主分享   
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1122/1500
排名
16955
昨日变化

1

主题

727

帖子

1122

积分

Rank: 6Rank: 6Rank: 6

UID
199204
好友
1
蛮牛币
1012
威望
0
注册时间
2017-1-5
在线时间
354 小时
最后登录
2019-7-23
2019-3-19 09:48:13 显示全部楼层
谢谢分享
回复

使用道具 举报

4四处流浪
401/500
排名
12676
昨日变化

3

主题

177

帖子

401

积分

Rank: 4

UID
289410
好友
0
蛮牛币
330
威望
0
注册时间
2018-7-11
在线时间
149 小时
最后登录
2019-7-22
2019-3-19 12:17:42 显示全部楼层
9999999999999999999999
回复 支持 反对

使用道具 举报

2初来乍到
140/150
排名
14744
昨日变化

0

主题

12

帖子

140

积分

Rank: 2Rank: 2

UID
312180
好友
0
蛮牛币
253
威望
0
注册时间
2019-1-19
在线时间
74 小时
最后登录
2019-7-23
2019-3-19 13:45:39 显示全部楼层
666666666666
回复

使用道具 举报

5熟悉之中
809/1000
排名
3600
昨日变化

0

主题

102

帖子

809

积分

Rank: 5Rank: 5

UID
71644
好友
0
蛮牛币
1516
威望
0
注册时间
2015-1-28
在线时间
291 小时
最后登录
2019-7-19
2019-3-19 14:27:26 显示全部楼层
谢谢分享啊!!!
回复

使用道具 举报

8常驻蛮牛
7652/10000
排名
250
昨日变化

0

主题

3941

帖子

7652

积分

Rank: 8Rank: 8

UID
3215
好友
0
蛮牛币
33
威望
0
注册时间
2013-9-4
在线时间
1715 小时
最后登录
2019-7-20
2019-3-19 20:25:51 显示全部楼层
哒哒哒哒哒哒多多多多多多多
回复 支持 反对

使用道具 举报

排名
48134
昨日变化

0

主题

14

帖子

27

积分

Rank: 1

UID
317153
好友
0
蛮牛币
5
威望
0
注册时间
2019-3-20
在线时间
9 小时
最后登录
2019-4-3
2019-3-20 01:26:20 显示全部楼层
1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
回复 支持 反对

使用道具 举报

5熟悉之中
756/1000
排名
8916
昨日变化

0

主题

426

帖子

756

积分

Rank: 5Rank: 5

UID
36289
好友
0
蛮牛币
10
威望
0
注册时间
2014-7-25
在线时间
198 小时
最后登录
2019-7-9
2019-3-20 08:51:08 显示全部楼层
Unity实用小工具或脚本—利用反射制作动态编辑栏
回复 支持 反对

使用道具 举报

7日久生情
1840/5000
排名
1989
昨日变化

6

主题

558

帖子

1840

积分

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

UID
54335
好友
3
蛮牛币
5431
威望
0
注册时间
2014-11-9
在线时间
594 小时
最后登录
2019-7-23
2019-3-20 09:03:08 显示全部楼层
利用反射制作动态编辑栏
回复 支持 反对

使用道具 举报

4四处流浪
388/500
排名
12479
昨日变化
1

0

主题

82

帖子

388

积分

Rank: 4

UID
313384
好友
0
蛮牛币
929
威望
0
注册时间
2019-2-4
在线时间
232 小时
最后登录
2019-7-23
2019-3-20 13:35:45 显示全部楼层
好的。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则