问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何创建访问集合元素的表达式?

发布网友 发布时间:2022-04-10 08:40

我来回答

2个回答

热心网友 时间:2022-04-10 10:09

这问题有点意思

首先,你那写法叫索引器(Indexer),在.NET中索引器跟属性(Property)实际上是一回事儿,索引器只是有参数的属性罢了,普通属性是无参数的,了解这点之后就简单了,只需要找到这的属性即可

其次,如何获取这个特殊属性?有两个方法:

    一,GetProperty("Item"),这能获取大部分属性,除开DefaultMemberAttribute自定义的,比如string就得用GetProperty("Chars")

    二,用GetDefaultMembers方法,这个适用面更广,但是代码量更多

最后,获取属性之后,就可以使用GetGetMethod和GetSetMethod来获取其取值和赋值的内部方法

        public static LambdaExpression GetIndexGetExp<objT, indexT>()
        {
            Type objType = typeof(objT), indexType = typeof(indexT);
            var defaultMembers = objType.GetDefaultMembers();
            PropertyInfo propInfo = null;
            foreach (var mem in defaultMembers)
            {
                if (mem.MemberType == MemberTypes.Property)
                {
                    propInfo = (PropertyInfo)mem;
                    if (propInfo == objType.GetProperty(propInfo.Name, new[] { indexType }))
                    {
                        break;
                    }
                }
            }
            var getMethod = propInfo.GetGetMethod();
            var objParm = Expression.Parameter(objType);//实例对象参数
            var valueParm = Expression.Parameter(indexType);//索引器参数
            var getExp= Expression.Call(objParm, getMethod, new[] { valueParm });
            var lambda=Expression.Lambda(getExp, new[] { objParm, valueParm });
            return lambda;
        }
        public static LambdaExpression GetIndexSetExp<objT, indexT>()
        {
            Type objType = typeof(objT), indexType = typeof(indexT);
            var defaultMembers = objType.GetDefaultMembers();
            PropertyInfo propInfo = null;
            foreach (var mem in defaultMembers)
            {
                if (mem.MemberType == MemberTypes.Property)
                {
                    propInfo = (PropertyInfo)mem;
                    if (propInfo == objType.GetProperty(propInfo.Name, new[] { indexType }))
                    {
                        break;
                    }
                }
            }
            var setMethod = propInfo.GetSetMethod();
            var objParm = Expression.Parameter(objType);//实例对象参数
            var indexParm = Expression.Parameter(indexType);//索引器参数
            var valueParm = Expression.Parameter(propInfo.PropertyType);//索引器值
            var setExp = Expression.Call(objParm, setMethod, new[] { indexParm, valueParm });
            var lambda = Expression.Lambda(setExp, objParm, indexParm, valueParm);
            return lambda;
        }

调用及结果

            var stringFunc = GetIndexGetExp<string, int>().Compile();
            string s = "abcd";
            Console.WriteLine(stringFunc.DynamicInvoke(s, 0));
            //a
            var arrFunc = GetIndexSetExp<List<int>, int>().Compile();
            var arr = new List<int> { 1, 2, 3, 4, 5 };
            arrFunc.DynamicInvoke(arr, 0, 2);
            Console.WriteLine(string.Join(",", arr));
            //2,2,3,4,5

热心网友 时间:2022-04-10 11:27

实现IDictionary接口就行了啊
MSDN范例:http://msdn.microsoft.com/zh-cn/library/system.collections.idictionary(VS.80).aspx
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
七十平米住宅土地证过户费用大约是多少? 七十平米房子七十五万人民币过户费多少钱? 七十平米房子十一万过户多少钱, 09年3月研究生毕业,可以报考09年吴江村官吗,原籍不在吴江 应届本科生进中达(苏州吴江)电子困难吗? 我想起一个好听的英文名字,中文姓名:庞慧,女,请大家帮忙,谢谢! ...丹琪,想根据中文取一个英文名字,请大家帮忙想想。 希望读音相近!谢谢... 怎样在家制作雪米饼? 弱电安装中预留3SC50+SC40是什么意思 2*sc50fc是弱电的预留管,是留两根50管吗 一个关于安卓平板电脑用SIM卡上不了网的问题。 我有一平板电脑带插手机卡可插入(移动电话卡)后显示无法访问移动网络该怎么办? 平板电脑可以插手机卡,也有4g网但是没有网络 我有一张联通卡按在手机平板上,可以打电话,但是不能上网。怎么回事 QQ邮箱里的邮件如果撤回成功是不是对方没有看到邮件? 海棠湾免税店哪个品牌的表最贵 海棠湾的特产 听说亚特兰蒂斯在三亚海棠湾内,不太了解海棠湾,谁能大致普及一下海棠湾怎么样啊,谢谢~ 请问三亚 海棠湾现在怎么样啊? 中银国际证券的沽出状态不接受是什么意思 中银国际证券就是银河证券么么过ji 还万用金信用卡会降额度吗 济宁银行电话银行多少?知道怎么把济宁银行卡绑定在手机上也可以 朋友给我一个QQ群号码和密码,我怎么也找不到手机上能登录群的,怎么办 有哪个公司做过蓝牙音响控制板开发? 蓝牙音响:蓝牙音响共有几个阶段,蓝牙音响发展史 蓝牙有音响未来五年的发展方向是什么?如何解决蓝牙音响多台连接问题? 哪两种PHP内部的接口提供了 把一个对象当数组用的函数? - 技术问答 下载什么软件可以制花样图片 韩版花样男子的经典语句(满意把全部分拿出来) 平板电脑插上4g卡有4g信号为啥不能上网 待业在家找不到工作究竟是种怎样的生活状态? 应届生找不到合适的工作,该一直呆在家吗? 中专毕业一直找不到合适的工作,在家呆了两年,我该怎么办? 考研失败后,找不到工作在家待业应该怎么办? 着急啊!找不到工作,在家里呆了很久了,父母都在唠唠叨叨了,该怎么办? 你你会因为长时间待在家里找不到工作而情绪烦闷心情低落吗? 一下子辞职了好工作,现在找不到更好的,在家呆着怎么办? 辞职在家一段时间找不到出路,闷在家里发慌,是何等感受? 失业在家天天受气,从早气到晚,找不到工作怎么办? 找不到工作怎么办 都在家歇了 找不到工作怎么办 找不到工作,家里人天天说我上大学白念了。什么干不了,真的很难受,很烦。太伤人自尊了! 在假期找不到合适的假期工作,你会一直呆在家里吗? 找不到工作怎么办 在家好难受 考上公务员算不算违背保密协议 西安灵活就业人员养老保险买房能用吗? 陕西灵活就业人员缴纳保社保在什么情况下50岁能够领退休金女性? 陕西省灵活就业人员女性退休年龄 宅基地私下协议是否有效 宅基地转让协议有效吗?