You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework 4.8:如何实现可排序含name属性类的泛型函数

解决泛型函数无法访问类的name属性问题

问题根源在于泛型类型T没有明确的约束,编译器无法确认所有传入的T类型都包含name属性。通过接口约束可以解决这个问题,具体步骤如下:

1. 定义统一接口,规范带name属性的类

先创建一个接口,明确要求所有需要传入该函数的类必须实现name(或遵循命名规范的Name)属性:

public interface INamed
{
    // 若你的类属性是小写name,这里同步改为string name { get; }
    string Name { get; }
}

让你的目标类实现这个接口:

// 示例类,替换成你实际使用的类
public class User : INamed
{
    public string Name { get; set; }
    // 其他属性...
}

2. 修改泛型函数,添加约束并调整参数

更新原函数,给泛型T添加接口约束,同时将参数里的List<Class>改为List<T>,确保类型统一:

private void ReadFilesCommon<T>(string path, List<T> data, IParser parser, Func<KeyValuePair<string, object>, T> classCreator)
    where T : INamed // 关键约束:限定T必须实现INamed接口
{
    foreach (List<KeyValuePair<string, object>> entry in parser.ParseFiles(path))
    {
        foreach (KeyValuePair<string, object> entry2 in entry)
        {
            data.Add(classCreator(entry2));
        }
    }

    // 现在可直接访问T的Name属性进行排序
    data.Sort((t1, t2) => t1.Name.CompareTo(t2.Name));
}

补充说明

  • 约束where T : INamed会告诉编译器:所有传入的T类型都必然包含INamed接口定义的属性,因此可以安全访问Name。
  • 建议遵循C#命名规范,使用帕斯卡命名法(首字母大写)定义属性(如Name而非name),保持代码风格统一。

内容的提问来源于stack exchange,提问作者Filipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:10:30