C#,如何在泛型方法中访问对象方法

Posted

技术标签:

【中文标题】C#,如何在泛型方法中访问对象方法【英文标题】:C#, How to access object methods in a generic method 【发布时间】: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 听起来通常是一个属性,而不是一个方法。 【参考方案1】:

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

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

文档:

Constraints on type parameters (C# Programming Guide)

【讨论】:

以上是关于C#,如何在泛型方法中访问对象方法的主要内容,如果未能解决你的问题,请参考以下文章

java在泛型方法中使用它(继承)

如何在泛型集合上创建扩展方法

详解C#泛型

详解C#泛型

在泛型方法中处理类型创建

在泛型方法中返回原始集合类型