C# 可以将两种重载方法转换为单一方法 公共无效导航(无效) 航行 TNavigationParameter navParam, Action Action=null),其中TContentPage:ContentPage { var contentPage=App.Container.Resolve(); action?.Invoke(contentPage,navParam); PushAsync(contentPage,true); } 公共无效导航(无效导航, tNavigationParam参数navParam,t选定的导航, 动作Action=null,动作action1=null )其中t内容页:内容页 { var contentPage=App.Container.Resolve(); action?.Invoke(contentPage,navParam); action1?调用(contentPage,nav); PushAsync(contentPage,true); }

C# 可以将两种重载方法转换为单一方法 公共无效导航(无效) 航行 TNavigationParameter navParam, Action Action=null),其中TContentPage:ContentPage { var contentPage=App.Container.Resolve(); action?.Invoke(contentPage,navParam); PushAsync(contentPage,true); } 公共无效导航(无效导航, tNavigationParam参数navParam,t选定的导航, 动作Action=null,动作action1=null )其中t内容页:内容页 { var contentPage=App.Container.Resolve(); action?.Invoke(contentPage,navParam); action1?调用(contentPage,nav); PushAsync(contentPage,true); },c#,generics,xamarin.forms,overloading,C#,Generics,Xamarin.forms,Overloading,这是我用来导航的两个重载方法。我可以使用其中一个吗?我可以修改此方法而不使用两个操作功能吗?我可以修改第二个方法以便在这两种情况下使用吗?除非您想使用具体类型或接口来使用TNavigationParameter,或者至少选择t,则无需组合这两种方法,因为第二个变量中有一个额外的变量,并且无论如何都需要填写该参数。无论如何,您都必须创建一个重载(以删除它) 在我看来,保留你所拥有的 是的,您可以将它们分解为一个方法,但是使用您拥有的泛型类型参数,您将需要传入一个幻像泛型类型参数,在我看来,这是一种

这是我用来导航的两个重载方法。我可以使用其中一个吗?我可以修改此方法而不使用两个操作功能吗?我可以修改第二个方法以便在这两种情况下使用吗?除非您想使用具体类型或接口来使用
TNavigationParameter
,或者至少选择
t
,则无需组合这两种方法,因为第二个变量中有一个额外的变量,并且无论如何都需要填写该参数。无论如何,您都必须创建一个重载(以删除它)

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

是的,您可以将它们分解为一个方法,但是使用您拥有的泛型类型参数,您将需要传入一个幻像泛型类型参数,在我看来,这是一种混乱和气味


而且,
action
action1
比最佳命名要差。

可以

将可选参数放在方法定义的末尾。根据我的观察,您的第二种方法因参数而异,例如-
t选择的导航
Actionaction1=null

我想这会很好:

  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);
    }
公共空间导航(
无活力航行,
TNavigationParameter navParam,
Action=null,
Action action1=null,
t选定导航=默认值(t选定)
)其中t内容页:内容页
{
var contentPage=App.Container.Resolve();
action?.Invoke(contentPage,navParam);
action1?调用(contentPage,nav);
PushAsync(contentPage,true);
}

是什么阻止您在两种场景中使用第二种方法?如果action1为null(第一个方法的场景),并且您调用第二个方法,那么调用第一个方法的结果应该与调用第一个方法的结果相同。您可以用一个示例说明当action1为null时如何调用函数吗,我知道必须有一个重载部分。我在我的最后一个项目中做了这件事,所以他们要求使代码更简洁,并将它们变成一个函数如何做that@ish1104除非您想为
TNavigationParameter
t选定的
使用具体类型或接口,否则将其作为单一方法是没有意义的。事实上,这种用法比2个重载方法更奇怪。如果action1不为null,则不能保证nav可用。但除此之外,我认为我们不能将null设置为默认的t generic page参数,它应该会给出一个错误。@ish1104请尝试以下操作:
TSelected nav=default(TSelected)
,请理解这不一定是null,但这不应该是一个问题,因为如果action1为null,您将不会使用它。如果action1未检查它是否为null,根据@Peeyussingh的建议修改了我的答案
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);
}