c# - 如何扩展基类功能

标签 c# inheritance

我有一个类:

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/

相关文章:

java - 错误: Constructor Room in class Room cannot be applied to given types

c# - .NET Micro Framework 的 UI 控件库

c# - 使 Refit 自动在查询字符串中提供参数

Haskell:类型类:多重继承示例

c++ - 从 C++ 中的抽象类派生的类中没有销毁阶段

c# - 更改派生类中属性的值?

c# - 有没有办法以编程方式导出/保存生成的 javascript 和 css 包?

c# - UWP App 总是以非零返回码退出

java - 需要将Java编写的加密镜像到C#中

inheritance - 为什么 Dart 不继承构造函数?