【问题标题】:C#, How to access object methods in a generic methodC#,如何在泛型方法中访问对象方法
【发布时间】:2021-05-07 16:54:03
【问题描述】:

我有 2 个具有方法 isSenior() 的数据类。

public class Staff : Member, IComparable<Staff>, IEquatable<Staff>
{
    public string Occupation { get; set; }
    public override bool isSenior()
    {
        var today = DateTime.Today;
        var age = today.Year - Birthday.Year;

        if (age > 65)
        {
            return true;
        }
        return false;
    }
}

public class Player : Member, IComparable<Player>, IEquatable<Player>
{
    public double Height { get; set; }
    public string Position { get; set; }
    public string Club { get; set; }
    public bool Invited { get; set; }
    public bool Captain { get; set; }
    public override bool isSenior()
    {
        var today = DateTime.Today;
        var age = today.Year - Birthday.Year;

        if (age > 30)
        {
            return true;
        }
        return false;
    }
}

我想在另一个返回所有高级人员列表的通用方法中使用此方法,例如

List<Player> allSeniorPlayers = TaskUtils.findSeniorMembers<Player>(allPlayers)

是否可以像这样调用 isSenior() 方法:

    public List<T> findSeniorMembers<T>(List<T> allMembers)
    {
        List<T> seniorMembers = new List<T>();
        foreach (T member in allMembers)
        {
            if(member.isSenior())
            {
                seniorMembers.Add(member);
            }
        }
        return seniorMembers;
    }

错误出现在 member.isSenior() 上。有没有办法让这个工作?

【问题讨论】:

  • 您没有显示isSenior 的声明位置,但假设它在Member 中,我怀疑您只需要约束T:public List&lt;T&gt; findSeniorMembers&lt;T&gt;(List&lt;T&gt; allMembers) where T : Member。更多注意事项:1) 方法主体可以是 allMembers.Where(member =&gt; member.IsSenior()).ToList(); 2) 现在是修改名称以遵循 .NET 命名约定的好时机 - 方法应以大写字母开头; 3) IsSenior 听起来通常是一个属性,而不是一个方法。

标签: c# object generics generic-list


【解决方案1】:

如果isSeniorMember中定义,你只需要将T限制为Member或其子类型:

public List<T> findSeniorMembers<T>(List<T> allMembers) where T : Member

文档:

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2012-02-27
    • 1970-01-01
    • 2011-02-27
    • 2011-04-23
    相关资源
    最近更新 更多