首页 > 解决方案 > 有没有办法在不知道列表类型的情况下只给一个函数命名一个列表?

问题描述

我需要一个函数来获取对象的所有参数。我的对象存储在不同的列表中。例如,我有一个来自 Student 类型的名为 Student 的列表,以及一个来自 Lecturer 类型的名为 Lecturers 的列表。

    public static void getinfo(string objectname)
    {
        var foundobject = listname.Find(x => x.name == objectname);
        foundobject.info();
    }

现在我想搜索一个具有特定名称(objectname)的对象,并且我想指定要搜索的列表。但我不知道如何将列表名传递给我的函数。

标签: c#listfunction

解决方案


您可以将其设为通用并通过 aFunc<T, string>来获取属性:

public static void GetInfo<T>(string objectname, List<T> list, Func<T, string> getProperty)
{
    T foundobject = list.Find(x => getProperty(x) == objectname);
    // ...
}

例如,您可以这样称呼它:

List<Lecturer> lecturers = new List<Lecturer>();
GetInfo("lecturername", lecturers, l => l.Name);

现在它说“'T'不包含'info'的定义,并且找不到接受'T'类型的第一个参数的扩展方法'info'

原因是您在方法中使用了此代码:

foundobject.info();

在我的通用方法中还没有约束,T任何对象都可以。但不是任何对象都有方法info。因此,您需要一个限制可以使用的可能类型的约束。你可以让你的类实现一个通用接口,比如IInformable它有一个Info方法:

public interface IInformable
{
    void Info();
}

但是不要让他们直接实现它,你可以让两个类都从同一个类继承,Person因为它们都有一个Name并且每个人也应该有一个:

public abstract class Person : IInformable
{
    public string Name { get; set; }
    public void Info()
    {
        Console.WriteLine(Name); // for example
    }
}

我做到了,abstract因为人不是很具体。但是你的课程是:

public class Lecturer : Person
{
}

public class Student: Person
{
}

现在,您可以将属性添加到仅针对学生和讲师的课程。

上面的通用方法需要一个约束,IInformable因为你想调用Info

public static void GetInfo<T>(string objectname, List<T> list, Func<T, string> getProperty) 
    where T: IInformable
{
    T foundobject = list.Find(x => getProperty(x) == objectname);
    foundobject.Info();
}

推荐阅读