将 C# 类属性作为参数传递给方法
Posted
技术标签:
【中文标题】将 C# 类属性作为参数传递给方法【英文标题】:Pass a C# class property as argument in a method 【发布时间】:2021-02-05 10:14:18 【问题描述】:我有一个 void SortTable,我可以根据属性(在本例中为 ticketId)对类实例数组进行排序。
private void SortTable()
if (ascending)
Array.Sort(tickets,
delegate (TicketData x, TicketData y) return x.ticketId.CompareTo(y.ticketId); );
else
Array.Sort(tickets,
delegate (TicketData x, TicketData y) return y.ticketId.CompareTo(x.ticketId); );
ascending = !ascending;
它有效,但我有一个包含更多字段的表,我想按这些字段进行排序。我可以通过为表中的每个字段创建空白来解决这个问题。它就像 SortByTicketId()、SortByName() 等。但我想要一个函数来处理这个。
我想写这样的东西:
private void SortTable(sortByThisProperty)
Array.Sort(tickets,
delegate (TicketData x, TicketData y) return x.[sortByThisProperty].CompareTo(y.[sortByThisProperty]); );
但是这个伪代码不起作用,我看不出有办法将属性作为参数传递。 一定有其他方法可以做到这一点?
【问题讨论】:
看看动态linq 使用 LINQ 是最好的选择。您是否可以控制要排序的属性,还是允许用户选择要排序的内容? 【参考方案1】:为什么不使用 linq 的 OrderBy?
var employees = ....
employees.OrderBy(e => e.Name).ToArray();
但一种方法是使用像 linq 这样的选择器:
private void SortTable<T, Q>(T[] source, Func<T, Q> sortSelector)
where Q: IComparable<Q>
Array.Sort(source, (x, y) => sortSelector(x).CompareTo(sortSelector(y)));
);
你会以类似的方式使用它:employees.SortTable(e => e.Name);
【讨论】:
非常感谢。我正在尝试 OrderBy solotion,因为它非常简单。但我找不到调用函数并将某些内容传递给 OrderBy 的方法。这可能是因为我使用的是 Blazor,而且情况有些不同。using System.Linq
指令。我不知道 Blazor,说实话......
嗯,它工作得很好,考虑到 Blazor 只是有点不同,但我会弄清楚这一点。再次感谢【参考方案2】:
我从 Blazor onclick 事件中找到了一种方法。
private void SortBy(string columnName)
tickets = tickets.OrderBy(x => x.GetType().GetProperty(columnName).GetValue(x, null)).ToArray();
这样类属性可以作为字符串传递。
在 html 元素中添加:
<th @onclick="@(() => SortBy("ticketId"))">ID</th>
【讨论】:
以上是关于将 C# 类属性作为参数传递给方法的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC:将模型作为参数传递给控制器方法VS显式实例化它
模型在使用 C# 将 POST 方法作为参数传递给 ASP.NET MVC 中同一控制器的 GET 方法时获取 NULL