您可以将其设为通用并传递 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();
}