将 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 =&gt; e.Name);

【讨论】:

非常感谢。我正在尝试 OrderBy solotion,因为它非常简单。但我找不到调用函数并将某些内容传递给 OrderBy 的方法。这可能是因为我使用的是 Blazor,而且情况有些不同。 ID private void SortTable() ticket = ticket.OrderByDescending(e => e.ticketId).ToArray();我正在尝试在 OrderBy 中传递“e => e.ticketId”。 @tonyarntsen 确保你有 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# 类属性作为参数传递给方法的主要内容,如果未能解决你的问题,请参考以下文章

对象作为参数传递给另一个类,通过值还是引用?

将方法作为 SEL 参数传递给另一个类方法

将ajax请求中的多个参数传递给函数后面的C#代码

Spring MVC:将模型作为参数传递给控制器​​方法VS显式实例化它

如何将枚举作为字符串参数传递给 Authorize 属性?

模型在使用 C# 将 POST 方法作为参数传递给 ASP.NET MVC 中同一控制器的 GET 方法时获取 NULL