我有一个类:
public class Person {
public string FirstName = "";
public string LastName = "";
}
和派生类:
public class HRPerson : Person {
public string GetSomething() {
//calculate something
}
}
本质上,我想扩展基类的功能。使用看起来像这样,其中 GetAllPerson
返回 List<Person>
.
class Program
{
static List<HRPerson> GetAllHRPerson()
{
List<HRPerson> HRPersonList = new List<HRPerson>();
foreach (Person person in GetAllPerson)
{
HRPersonList.Add(person);
}
return HRPersonList;
}
}
它不编译,说参数没有重载,当我尝试将 person 转换为 HRPerson
时,我收到运行时错误“无法将 Person
类型的对象转换为类型 HRPerson
”错误。
我该如何着手添加这样的附加功能?
最佳答案
听起来您的 GetAllPerson
正在返回一些非 HR 人员...
假设是这种情况,而您只想过滤掉那些,最简单的方法是使用 LINQ 的 OfType
方法:
static List<HRPerson> GetAllHRPerson()
{
return GetAllPerson().OfType<HRPerson>().ToList();
}
(旁注:请避免像这样的公共(public)字段,常量除外。字段应该是实现细节,而不是公共(public) API 的一部分。)
当然,如果您的 Person
实例实际上都不是 HRPerson
的实例,那对您没有帮助。实例一旦创建就无法更改其类型。目前还不清楚您的情况 - 如果此答案对您没有帮助,请提供更多详细信息。
编辑:我仍然不确定您是否需要扩展方法,但如果您需要,它会是这样的:
public static class PersonExtensions
{
public static string GetSomething(this Person person)
{
// Do something with the given Person
}
}
然后您可以在任何 Person
上调用它,就好像它是一个实例方法一样:
Person person = ...;
string something = person.GetSomething();
但这不是多态性——并不是说您要更改Person
对象的任何内容,您的描述仍然使它听起来像您真的想做的那样。 ..
关于c# - 如何扩展基类功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15508040/