香港6合总彩透码主论坛
 找回密码
 注册帐号

扫一扫,访问微社区

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

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

124

主题

595

帖子

6994

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
109
蛮牛币
5287
威望
0
注册时间
2013-9-10
在线时间
1542 小时
最后登录
2019-8-24

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

马?#29486;?#20876;,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐?#29275;?a href="member.php?mod=register" title="注册帐号">注册帐号

x

1、介绍

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


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

[C#] ?#35838;?#26412;查看 复制代码
[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结构体中,有字?#25105;?#26377;属性,并?#19968;?#26377;一个泛型ListData属性。这里要处理的是将前面四个字段和属性反射并生成编辑框的同时,还能动态的将ListData的数据信息也反射出?#30784;?/font>

二、实现

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

[C#] ?#35838;?#26412;查看 复制代码
    /// <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#] ?#35838;?#26412;查看 复制代码
/// <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#] ?#35838;?#26412;查看 复制代码
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?#20445;?#21015;表里装载的就是结构体“Test_Data1”实例“testData1”中的所有非泛型字段或属性的名字和值。另外,GetVaule_ReflectMethod”方法还有一个Out参数“out List<L> listGenericDatas?#20445;?#35813;参数是将结构体中的泛型数据提取出?#30784;?/font>

2、完整的代码:

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

三、总结

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

2、无论是字段还是属性都可?#28304;?/font>

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




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

查看全?#31185;?#20998;总评分 : 鲜花 +5

回复

使用道具 举报

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

4

主题

2462

帖子

5121

积分

Rank: 8Rank: 8

UID
182740
好友
2
蛮牛币
9274
威望
0
注册时间
2016-11-10
在线时间
1029 小时
最后登录
2019-8-11
沙发
2019-3-18 18:46:39 只看该作者
谢谢分享啊!!!
回复

使用道具 举报

排名
1365
昨日变化

2

主题

162

帖子

1791

积分

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

UID
148089
好友
0
蛮牛币
2664
威望
0
注册时间
2016-5-10
在线时间
719 小时
最后登录
2019-8-23
板凳
2019-3-18 19:21:51 只看该作者
6666666666666666666666666
回复 支持 反对

使用道具 举报

排名
4092
昨日变化

0

主题

1412

帖子

2139

积分

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

UID
254705
好友
1
蛮牛币
1939
威望
0
注册时间
2017-11-16
在线时间
365 小时
最后登录
2019-8-25
地板
2019-3-19 08:36:15 只看该作者
6666666666666666666666666666
回复 支持 反对

使用道具 举报

排名
123
昨日变化

0

主题

174

帖子

3472

积分

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

UID
6304
好友
0
蛮牛币
8392
威望
0
注册时间
2013-10-24
在线时间
858 小时
最后登录
2019-8-24
5#
2019-3-19 09:27:08 只看该作者
不错....?#34892;?#20998;享..
回复

使用道具 举报

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

0

主题

189

帖子

1344

积分

Rank: 6Rank: 6Rank: 6

UID
188322
好友
0
蛮牛币
4470
威望
0
注册时间
2016-11-30
在线时间
403 小时
最后登录
2019-8-23
6#
2019-3-19 09:45:30 只看该作者
谢谢 楼主分享   
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1138/1500
排名
16956
昨日变化

1

主题

729

帖子

1138

积分

Rank: 6Rank: 6Rank: 6

UID
199204
好友
1
蛮牛币
1098
威望
0
注册时间
2017-1-5
在线时间
368 小时
最后登录
2019-8-22
7#
2019-3-19 09:48:13 只看该作者
谢谢分享
回复

使用道具 举报

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

3

主题

178

帖子

403

积分

Rank: 4

UID
289410
好友
0
蛮牛币
404
威望
0
注册时间
2018-7-11
在线时间
150 小时
最后登录
2019-8-21
8#
2019-3-19 12:17:42 只看该作者
9999999999999999999999
回复 支持 反对

使用道具 举报

排名
14744
昨日变化

0

主题

12

帖子

150

积分

Rank: 3Rank: 3Rank: 3

UID
312180
好友
0
蛮牛币
308
威望
0
注册时间
2019-1-19
在线时间
84 小时
最后登录
2019-8-7
9#
2019-3-19 13:45:39 只看该作者
666666666666
回复

使用道具 举报

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

0

主题

102

帖子

827

积分

Rank: 5Rank: 5

UID
71644
好友
0
蛮牛币
1602
威望
0
注册时间
2015-1-28
在线时间
309 小时
最后登录
2019-8-24
10#
2019-3-19 14:27:26 只看该作者
谢谢分享啊!!!
回复

使用道具 举报

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

0

主题

3951

帖子

7673

积分

Rank: 8Rank: 8

UID
3215
好友
0
蛮牛币
13
威望
0
注册时间
2013-9-4
在线时间
1726 小时
最后登录
2019-8-15
11#
2019-3-19 20:25:51 只看该作者
?#32773;者者者者?#22810;多多多多多多
回复 支持 反对

使用道具 举报

排名
48136
昨日变化

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、文章必须是图文?#38382;健#?#33267;少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
回复 支持 反对

使用道具 举报

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

0

主题

432

帖子

786

积分

Rank: 5Rank: 5

UID
36289
好友
0
蛮牛币
50
威望
0
注册时间
2014-7-25
在线时间
222 小时
最后登录
2019-8-25
13#
2019-3-20 08:51:08 只看该作者
Unity实用小工具或脚本—利用反射制作动态编辑栏
回复 支持 反对

使用道具 举报

排名
1989
昨日变化

6

主题

565

帖子

1872

积分

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

UID
54335
好友
3
蛮牛币
5439
威望
0
注册时间
2014-11-9
在线时间
619 小时
最后登录
2019-8-24
14#
2019-3-20 09:03:08 只看该作者
利用反射制作动态编辑栏
回复 支持 反对

使用道具 举报

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

0

主题

82

帖子

409

积分

Rank: 4

UID
313384
好友
0
蛮牛币
1039
威望
0
注册时间
2019-2-4
在线时间
253 小时
最后登录
2019-8-25
15#
2019-3-20 13:35:45 只看该作者
好的。。。
回复

使用道具 举报

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

本版积分规则

香港6合总彩透码主论坛
时时彩组选包胆玩法 天津时时直播网站 全网36码特围网址 河内时时彩人工计划软件 内蒙古时时彩稳赚技巧 pc蛋蛋每天稳赚300元 押大小最好的倍投方法 天津时时平台网投 江苏时时开奖视频直播 后三组选包胆技巧时时 彩