Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在不知道列表类型的情况下,只给函数指定一个名称的列表?_C#_List_Function - Fatal编程技术网

C# 有没有一种方法可以在不知道列表类型的情况下,只给函数指定一个名称的列表?

C# 有没有一种方法可以在不知道列表类型的情况下,只给函数指定一个名称的列表?,c#,list,function,C#,List,Function,我需要一个函数来获取对象的所有参数。 我的对象存储在不同的列表中。例如,我有一个名为Student类型的学生列表和一个名为讲师类型的讲师列表 public static void getinfo(string objectname) { var foundobject = listname.Find(x => x.name == objectname); foundobject.info(); } 现在,我想搜索具有特定名称obje

我需要一个函数来获取对象的所有参数。 我的对象存储在不同的列表中。例如,我有一个名为Student类型的学生列表和一个名为讲师类型的讲师列表

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

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

您可以将其设置为泛型并传递Func以获取属性:

public static void GetInfo<T>(string objectname, List<T> list, Func<T, string> getProperty)
{
    T foundobject = list.Find(x => getProperty(x) == objectname);
    // ...
}
在我的通用方法中,还没有约束,所以T可以是任何对象。但没有任何对象具有方法信息。因此,您需要一个约束来限制可以使用的可能类型。您可以让您的类实现一个公共接口,如IInformable,它有一个Info方法:

但是,您可以让两个类从同一个类Person继承,而不是让它们直接实现,因为它们都有一个名称,每个人也应该有一个名称:

public abstract class Person : IInformable
{
    public string Name { get; set; }
    public void Info()
    {
        Console.WriteLine(Name); // for example
    }
}
我把它抽象化了,因为人不是很具体。但你们的课程是:

public class Lecturer : Person
{
}

public class Student: Person
{
}
现在,您可以向类中添加只针对学生和讲师的属性

上述泛型方法需要IInformable的约束,因为您要调用Info:


您可以将其设置为泛型并传递Func以获取属性:

public static void GetInfo<T>(string objectname, List<T> list, Func<T, string> getProperty)
{
    T foundobject = list.Find(x => getProperty(x) == objectname);
    // ...
}
在我的通用方法中,还没有约束,所以T可以是任何对象。但没有任何对象具有方法信息。因此,您需要一个约束来限制可以使用的可能类型。您可以让您的类实现一个公共接口,如IInformable,它有一个Info方法:

但是,您可以让两个类从同一个类Person继承,而不是让它们直接实现,因为它们都有一个名称,每个人也应该有一个名称:

public abstract class Person : IInformable
{
    public string Name { get; set; }
    public void Info()
    {
        Console.WriteLine(Name); // for example
    }
}
我把它抽象化了,因为人不是很具体。但你们的课程是:

public class Lecturer : Person
{
}

public class Student: Person
{
}
现在,您可以向类中添加只针对学生和讲师的属性

上述泛型方法需要IInformable的约束,因为您要调用Info:


你应该传递一个基本接口的IEnumerable。看起来你需要一个列表,这样做容易多了。或者你可以使用一些Linq扩展,比如.Select或.Cast。你应该传递一个基本接口的IEnumerable。看起来你需要一个列表,这样做容易多了。或者您可以使用一些Linq扩展,如.Select或.Cast。谢谢您的回答;我尝试了,但出现了一个错误,找不到类型或命名空间名称“T”。在我问这个问题之前,我尝试了getinfoList listname、string objectname,但出现了相同的错误。我是否应该使用特定的使用系统。。。刚开始的时候?你用过GetInfo吗?我忘了。现在它说'T'不包含'info'的定义,并且找不到接受第一个'T'类型参数的扩展方法'info'。谢谢您的回答;我尝试了,但出现了一个错误,找不到类型或命名空间名称“T”。在我问这个问题之前,我尝试了getinfoList listname、string objectname,但出现了相同的错误。我是否应该使用特定的使用系统。。。刚开始的时候?你用过GetInfo吗?我忘了。现在它说'T'不包含'info'的定义,并且找不到接受第一个'T'类型参数的扩展方法'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();
}