【问题标题】:Is there a way to give a List only with a name to a function without knowing the type of the list?有没有办法在不知道列表类型的情况下只给一个函数命名一个列表?
【发布时间】:2019-07-02 23:26:30
【问题描述】:

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

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

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

【问题讨论】:

  • 你应该传递一个基本接口的 IEnumerable。
  • 看起来你需要一个 List 这样就容易多了。或者您可以使用一些 Linq 扩展,例如 .Select() 或 .Cast()。

标签: c# list function


【解决方案1】:

您可以将其设为通用并传递 Func<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”类型的第一个参数的扩展方法“信息”

原因是你在你的方法中使用了这段代码:

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();
}

【讨论】:

  • 感谢您的回答;)我试过了,但我得到一个错误“找不到类型或命名空间名称'T'”。我在问问题之前尝试了 getinfo(List listname, string objectname) 并且出现了同样的错误。我应该在开头使用特定的“使用系统...”吗?
  • 你用过GetInfo&lt;T&gt;吗?
  • 我忘了。现在它说“‘T’不包含‘info’的定义,并且找不到接受‘T’类型的第一个参数的扩展方法‘info’”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 2021-06-16
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多