【问题标题】:it is possible to made two overload method into single method可以将两个重载方法变成一个方法
【发布时间】:2019-04-17 03:53:29
【问题描述】:
  public void Navigate<TContentPage, TNavigationParameter>(INavigation 
  navigation,
        TNavigationParameter navParam,
        Action<TContentPage, TNavigationParameter> action = null) where TContentPage : ContentPage
    {
        var contentPage = App.Container.Resolve<TContentPage>();
        action?.Invoke(contentPage, navParam);
        navigation.PushAsync(contentPage, true);
    }

    public void Navigate<TContentPage, TNavigationParameter,TSelected>(INavigation navigation,
        TNavigationParameter navParam,TSelected nav,
        Action<TContentPage, TNavigationParameter> action = null,Action<TContentPage,TSelected>action1=null
        ) where TContentPage : ContentPage
    {
        var contentPage = App.Container.Resolve<TContentPage>();
        action?.Invoke(contentPage, navParam);
        action1?.Invoke(contentPage,nav);

        navigation.PushAsync(contentPage, true);
    }

这是我用来导航的两个重载方法我可以使用其中一个吗?我可以在没有两个动作函数的情况下修改这个方法我可以修改第二个方法以便在两种情况下都使用

【问题讨论】:

  • 是什么阻止您在两种情况下都使用第二种方法?如果 action1 为 null(第一种方法的场景)并且您调用第二种方法,它应该给出与调用第一种方法相同的结果
  • 你能用一个例子解释一下,如果action 1为null时如何调用函数

标签: c# generics xamarin.forms overloading


【解决方案1】:

除非您想为TNavigationParameter 或至少TSelected 使用具体类型或接口,否则无需将这两种方法结合起来,因为在第二个变体中有一个额外的Generic type parameter,并且该参数将无论如何都需要填写。无论如何,您都必须创建一个重载(以删除它)。

在我看来,保留你所拥有的。

是的,您可以将它们粉碎成一个方法,但是使用您拥有的泛型类型参数,您将需要传入一个幻像泛型类型参数,这在 IMO 中是令人困惑且有异味的。


另外,actionaction1 的命名并不理想。

【讨论】:

  • 是的,我知道必须有一个重载部分。我为我的最终项目做了这个,所以他们要求让这段代码更清晰,并将它们变成一个函数如何做到这一点
  • @ish1104 除非您想为TNavigationParameter,TSelected 使用具体类型或接口,否则将其作为单一方法是没有意义的。并且实际上用法会比 2 个重载方法更奇怪
【解决方案2】:

是的,你可以。

将可选参数放在方法定义的末尾。根据我的观察,您的第二种方法因参数而异 - TSelected navAction&lt;TContentPage,TSelected&gt;action1=null

我想这会很好:

public void Navigate<TContentPage, TNavigationParameter,TSelected>(
    INavigation navigation,
    TNavigationParameter navParam,
    Action<TContentPage, TNavigationParameter> action = null,
    Action<TContentPage,TSelected> action1 = null,
    TSelected nav = default(TSelected)
    ) where TContentPage : ContentPage
{
    var contentPage = App.Container.Resolve<TContentPage>();
    action?.Invoke(contentPage, navParam);
    action1?.Invoke(contentPage, nav); 
    navigation.PushAsync(contentPage, true);
}

【讨论】:

  • 如果 action1 不为空,则无法保证 nav 可用。但除此之外,是的,这是可行的
  • 我认为我们不能将 null 设置为默认的 T 通用页面参数,它应该会出错。
  • @ish1104 试试这个:TSelected nav= default(TSelected),明白这不一定是 null,但这不应该是一个问题,因为如果 action1 为 null,你就不会使用它
  • 没有检查它是否可以为空,根据@peeyushsingh 的建议修改了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2019-02-15
相关资源
最近更新 更多