c# - 通过向下转换参数自动重载和调用函数

标签 c# .net

我有一个名为 User 的基类。

我有 2 个来自 User 的派生类,分别称为 DerivedUser、OtherDerivedUser

我有以下代码:

 User user = newUser.CreateUserByType();
 SendNewUser(user); 

我不想执行 if 或 switch 语句,然后对派生类型执行向下转换。

我只想用一行语句执行调用。

 SendNewUser(user);

我想要**单行代码*。

这个方法根据类型将动态地“知道”要调用哪个方法。

我有 2 个名为 SendNewUser 的函数,它们由派生类型重载。

有没有办法通过向下转型到正确的派生类来调用正确的函数 (我不想显式转换)

   private static void SendNewUser(DerivedUser user){
       ...
      }

     private static void SendNewUser(OtherDerivedUser user){
       ...
      }

最佳答案

不,没有办法自动执行此操作。

您有几个选择:

  1. SendNewUser 移动到 DerivedUserOtherDerivedUser 类中。通过这种方式,您可以简单地重载该方法,您只需调用 user.SendNewUser()

  2. 检测类型并调用适当的方法:

    public void SendNewUser(User user)
    {
        if (user is DerivedUser)
        {
            SendNewUserInternal((DerivedUser)user);
        }
        else if (user is OtherDerivedUser)
        {
            SendNewUserInternal((OtherDerivedUser)user);
        }
        else
        {
            throw new InvalidArgumentException("Wrong user type.");
        }
    }
    

如您所见,该选项很容易出错,并且需要为您引入的每个新派生类工作。如果可以的话,我会坚持使用选项 1。

关于c# - 通过向下转换参数自动重载和调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44675344/

相关文章:

c# - MonoTouch WCF Service Reference.cs 错误

c# - 调用 C 代码时避免 AccessViolationException

javascript - 如何在ajax POST中发送参数?

C# 将 VBA For Each 循环转换为 C# 但给出编译错误

c# - DataReader 有行和数据,试图从中读取 "no data is present"

C# DataGridView 科尔斯潘

c# - 具有泛型重载的 GetMethod

c# - 在 C# 中转换泛型接口(interface)和类

.net - Delphi 7 中 .NETs NetworkStream/SslStream 的对应物

c# - 为什么for语句中的随机方法返回相同的结果?