1

我有一堂课:

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”错误。

我该如何添加这样的附加功能?

4

2 回答 2

6

听起来你GetAllPerson正在返回一些非人力资源人员......

假设是这种情况并且您只想过滤掉它们,那么使用 LINQ 的OfType方法是最简单的:

static List<HRPerson> GetAllHRPerson()
{
    return GetAllPerson().OfType<HRPerson>().ToList();
}

(旁注:请避免像这样的公共字段,除了常量。字段应该是实现细节,而不是公共 API 的一部分。)

当然,如果您的Person实例实际上都不是 的实例HRPerson,那将无济于事。实例创建后就无法更改其类型。目前尚不清楚您的情况是什么-如果此答案对您没有帮助,请提供更多详细信息。

编辑:我仍然不确定您是否需要扩展方法,但如果您这样做,它将类似于:

public static class PersonExtensions
{
    public static string GetSomething(this Person person)
    {
        // Do something with the given Person
    }
}

然后,您可以在 any 上调用它,就Person好像它是一个实例方法一样:

Person person = ...;
string something = person.GetSomething();

但这不是多态的——这并不是说你要改变Person对象的任何东西,你的描述仍然让它听起来像你真的想要做的……

于 2013-03-19T18:51:33.480 回答
0

根据您对 Jon Skeet 的回答的评论,这是您正在寻找的内容:

创建 Person 的子类,例如 NamedPerson。给 NamedPerson 一个 GetFullName 方法,它返回 Person 的全名。

然后从 NamedPerson 创建一个子类 HRPerson,并覆盖 GetFullName 以返回格式略有不同的名称。CCPerson 也将是 NamedPerson 的子类。

您无法控制 Person,但您可以完全控制 NamedPerson。那么你想要的是一个 NamedPersons 的列表,而不是 HRPersons 的列表。该列表可以包含裸 NamedPersons、HRPersons 或 CCPersons,但列表中的所有对象都是 NamedPersons 或其子类,因此它们都将具有 GetFullName。

于 2013-03-19T19:34:09.860 回答