可以将两个重载方法合并为一个方法

时间:2019-04-17 03:53:29

标签: c# generics xamarin.forms overloading

  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);
    }

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

2 个答案:

答案 0 :(得分:3)

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

海事组织保留你的财产

是的,您可以将它们粉碎成一个方法,但是拥有通用类型参数后,您将需要传递一个幻像通用类型参数,该参数会引起IMO,其混淆和气味


此外,actionaction1的命名也不尽人意

答案 1 :(得分:0)

是的。

将可选参数放在方法定义的末尾。根据我的观察,您的第二种方法因参数而异-TSelected navAction<TContentPage,TSelected>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);
}