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

传递属性本身作为C#中的参数分享

时间:2023-04-10 11:19:37 C#

C#学习教程:在C#中将属性本身作为参数传递不是财产的价值。该函数事先不知道将使用哪个属性进行排序。此示例最简单的方法是:创建4个具有不同参数类型的覆盖。另一种方法是使用typeof()内部函数。当Class1有数百个属性时,这两种方式都不可接受。到目前为止,我发现了以下方法:classClass1{stringvehName;国际最大速度;国际燃料容量;布尔正在飞行;}classProcessor{列出车辆=null;处理器(列表输入){vehicles=input;}ListsortBy(ListtoSort,stringpropName){if(toSort!=null&&toSort.Count>0){returntoSort.OrderBy(x=>typeof(Class1).GetProperty(propName).GetValue(x,null))}.ToList();}否则返回空值;}}classOuterUser{列出车辆=newList();//...填充列表Processorpr=newProcessor(vehicles);列表排序=pr.sortBy("maxSpeed");我不喜欢这种方法,因为在将字符串传递给处理函数时存在“人为错误”的风险。当字符串由代码的其他部分生成时,这会变得更难看。请建议更优雅的方式来实现Class1属性的传递以进行进一步处理。恕我直言,最好的选择是使用(或类似的东西):vehicles=sortBy(vehicles,Class1.maxSpeed);您可以将属性访问器传递给该方法。ListSortBy(ListtoSort,FuncgetProp){if(toSort!=null&&toSort.Count>0){returntoSort.OrderBy(x=>getProp(x)).ToList();}返回空值;调用它:varresult=SortBy(toSort,x=>x.maxSpeed);但您可以更进一步,编写自己的扩展方法。publicstaticclassCollectionExtensions{publicstaticListOrderByAsListOrNull(thisICollectioncollection,FunckeySelector)if(collection!=null&&collection.Count>0){returncollection.OrderBy(x=>keySelector(x)).ToList();}返回空值;现在你可以像这样对List进行排序sorted=toSort.OrderByAsListOrNull(x=>x.maxSpeed);还有Person[]people=...;列表sortedPeople=people.OrderByAsListOrNull(p=>p.LastName);请注意,我将第一个参数声明为ICollection,因为它必须满足两个条件:它必须具有Count属性,并且必须是IEnumerable才能应用LINQ方法OrderBy。List是一个ICollection,但也是一个数组Person[],就像许多其他集合一样。到目前为止,我已经展示了如何读取属性。如果该方法需要设置属性,还需要将其传递给setter委托voidReadAndWriteProperty(FuncgetProp,ActionsetProp)其中T是属性的类型。您可以使用lambda表达式传递属性信息:voidDoSomething(Expression>property){varpropertyInfo=((MemberExpression)property.Body).MemberasPropertyInfo;if(propertyInfo==null){thrownewArgumentException("Thelambdaexpression'property'shouldpointtoavalidProperty");}}用法:DoSomething(()=>this.MyProperty);我从@MatthiasG的回答中找不到的是如何获取属性值而不仅仅是它的名称。publicstaticstringMeth(Expression>expression){varname=((MemberExpression)expression.Body).Member.Name;varvalue=expression.Compile()();returnstring.Format("{0}-{1}",名称,值);}使用:Meth(()=>YourObject.Property);你为什么不使用Linq?比如:vehicles.OrderBy(v=>v.maxSpeed).ToList();这里有很好的解决方案...在C#中通过引用传递属性varprop=(PropertyInfo)expr.Member;prop.SetValue(目标,输入,空);}}voidMain(){varperson=newPerson();GetString("test",person,x=>x.Name);Debug.Assert(person.Name=="test");只是从上面的答案中添加。您还可以为订单方向执行简单标记。以上就是C#学习教程的全部内容:在C#中将属性本身作为参数传递。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassProcessor{publicListSortableItems{get;放;}publicProcessor(){SortableItems=newList();SortableItems.Add(newSortableItem{PropA="b"});SortableItems.Add(newSortableItem{PropA="a"});SortableItems.Add(newSortableItem{PropA="c"});}publicvoidSortItems(FunckeySelector,boolisAscending){if(isAscending)SortableItems=SortableItems.OrderBy(keySelector).ToList();否则SortableItems=SortableItems.OrderByDescending(keySelector)。列表();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

猜你喜欢