当前位置: 首页 > 编程语言 > C#

如何创建具有动态确定的属性名称的匿名对象?分享

时间:2023-04-10 15:31:13 C#

如何创建具有动态确定的属性名称的匿名对象?给定一个值数组,我想创建一个具有基于这些值的属性的匿名对象。属性名称只是“pN”,其中N是数组中值的索引。例如给定object[]values={123,"foo"};我想创建一个匿名对象new{p0=123,p1="foo"};我能想到的唯一方法就是用switch或者link来支持合理数量的参数,但是不知道有没有更优雅的方法:object[]parameterValues=newobject[]{123,“福”};动态值=空;switch(parameterValues.Length){case1:values=new{p0=parameterValues[0]};休息;case2:values=new{p0=parameterValues[0],p1=parameterValues[1]};休息;//等到合理的#ofparameters}背景我有一组现有的方法来对数据库执行sql语句。这些方法通常采用SQL语句(如果有)的字符串和参数object[]。理解是,如果查询使用参数,它们将被命名为@p0、@p1、@p2等。示例:publicintExecuteNonQuery(stringcommandText,CommandTypecommandType,paramsobject[]parameterValues){....}这将被调用:db.ExecuteNonQuery("insertintoMyTable(Col1,Col2)values(@p0,@p1)",CommandType.Text,123,"foo");现在我想在这个类中使用Dapper来包装和暴露Dapper的Query方法,并以与现有方法一致的方式进行,eg:publicIEnumerableExecuteQuery(stringcommandText,CommandTypecommandType,paramsobject[]parameterValues){....}但是Dapper的Query方法获取匿名对象中的参数值:vardog=connection.Query("selectAge=@Age,Id=@Id",new{Age=(int?)null,Id=guid});让我想到了一个关于创建匿名对象以将参数传递给Dapper的问题。使用@PaoloTedesco请求的DynamicParameter类添加代码。stringsql="select*fromAccountwhereId=@p0andusername=@p1";动态值=newDynamicParameter(123,"test");varaccounts=SqlMapper.Query(connection,sql,values);在Dapper中,SqlMapper.cs文件的第581行抛出异常:使用(varreader=cmd.ExecuteReader())并且异常是SqlException:必须声明标量变量“@p0”。检查cmd.Parameters属性显示没有为该命令配置任何参数。你在滥用Dapper,你永远不需要这样做,而是实现IDynamicParameters或使用特定的极其灵活的DynamicParameters类。具体来说:stringsql="select*fromAccountwhereId=@idandusername=@name";varvalues=newDynamicParameters();值.Add("id",1);values.Add("姓名","鲍勃");varaccounts=SqlMapper.Query(connection,sql,values);DynamicParameters可以在构造函数中接受匿名类。您可以使用AddDynamicParams方法连接AddDynamicParams。此外,对匿名类型没有严格的依赖性。Dapper将允许具体类型作为参数,例如:classStuff{publicintThing{get;放;}}...cnn.Execute("select@Thing",newStuff{Thing=1});Kevin有一个类似的问题:寻找一种快速简便的方法来组合POCO上的所有属性-DynamicParameters在这里完美运行,无需魔术跳圈。不完全是匿名对象,但是我如何实现一个根据数组中的值返回p1...pn值的DynamicObject?这适用于Dapper吗?示例:使用系统;使用System.Dynamic;使用System.Text.RegularExpressions;类DynamicParameter:DynamicObject{object[]_p;publicDynamicParameter(paramsobject[]p){_p=p;}publicoverrideboolTryGetMember(GetMemberBinderbinder,outobjectresult){Matchm=Regex.Match(binder.Name,@"^p(d+)$");如果(m.Success){intindex=int.Parse(m.Groups[1].Value);if(index你不能动态创建匿名对象。但是Dapper应该使用动态对象。要以一种很好的方式创建动态对象,你可以使用Clay。它使你能够编写像上面的代码是C#学习教程:如何创建一个anonymousobjectwithadynamicallydeterminedattributename?所有内容分享,如果对大家有用还需要了解更多C#学习教程,希望大家多多关注---varperson=New.Person();person["FirstName"]="Louis";//person.FirstName现返回"Louis"转载请注明出处: