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