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<T> findSeniorMembers<T>(List<T> allMembers) where T : Member
。更多注意事项:1) 方法主体可以是 allMembers.Where(member => member.IsSenior()).ToList();
2) 现在是修改名称以遵循 .NET 命名约定的好时机 - 方法应以大写字母开头; 3) IsSenior
听起来通常是一个属性,而不是一个方法。
【参考方案1】:
如果isSenior
在Member
中定义,你只需要将T
限制为Member
或其子类型:
public List<T> findSeniorMembers<T>(List<T> allMembers) where T : Member
文档:
Constraints on type parameters (C# Programming Guide)【讨论】:
以上是关于C#,如何在泛型方法中访问对象方法的主要内容,如果未能解决你的问题,请参考以下文章