c# - 有没有办法在不知道列表类型的情况下只给一个函数命名一个列表?
问题描述
我需要一个函数来获取对象的所有参数。我的对象存储在不同的列表中。例如,我有一个来自 Student 类型的名为 Student 的列表,以及一个来自 Lecturer 类型的名为 Lecturers 的列表。
public static void getinfo(string objectname)
{
var foundobject = listname.Find(x => x.name == objectname);
foundobject.info();
}
现在我想搜索一个具有特定名称(objectname)的对象,并且我想指定要搜索的列表。但我不知道如何将列表名传递给我的函数。
解决方案
您可以将其设为通用并通过 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();
}
推荐阅读
- javascript - 离子:JavaScript 在执行“离子服务”时内存不足
- batch-file - 如何删除目录中的所有文件和文件夹,分别删除整个目录树,列表文件中指定的文件除外?
- authentication - 如何获取在vaadin flow LoginForm中输入的用户名和密码?
- javascript - 如何使用 jQuery 在模态中打印 Java 对象
- android - 不定期从 Eddystone 信标获取 Android 信标库的测距更新
- vue.js - Vue2-类星体。如何将变量内容从服务器传递到浏览器
- app-store - 如果我在 AppStoreConnect 中加入了另一个组织,我可以注册为个人吗
- javascript - iframe 内的资源 URL 上下文中使用的不安全值
- json - 如何在shell脚本中循环一个jq数组结果
- sql - SQL - 具有 ID 的多行,但我想在一列中加入所有信息