使用Func<;T、 TResult>;c#

使用Func<;T、 TResult>;c#,c#,delegates,func,C#,Delegates,Func,我正在使用PCL,它还有许多功能也提供登录。我最近也开始使用代理 目前的情况是: 我有一个简单的方法,可以接受参数,并提供GPlus、Facebook或带有用户名和密码的简单登录。如下代码所示: public async Task<SignInResponse> SignInUsingFacebook(IFacebookInitializer faceBookConfiguration) { //my code } public async Task<SignInResp

我正在使用PCL,它还有许多功能也提供登录。我最近也开始使用代理

目前的情况是: 我有一个简单的方法,可以接受参数,并提供GPlus、Facebook或带有用户名和密码的简单登录。如下代码所示:

public async Task<SignInResponse> SignInUsingFacebook(IFacebookInitializer faceBookConfiguration)
{
   //my code
}
public async Task<SignInResponse> SignInUserNameAndPass(string username,string password)
{
   //my code
}
public async Task<SignInResponse> SignInUsingGPlus(IGPlusInitializer gPlusConfiguration)
{
   //my code
}
并根据提供给该方法的登录类型,自行处理登录过程,只返回
SignInResponse
对象


是否有一种方法可以使用代理完成此操作。而不是为每个案例调用3个单独的方法。如果是,那么请有人帮助输入要随LogInType一起传递给单个方法的参数。我知道它必须是一个
Func
,但是
Func
会是什么样子,因为它必须有3个不同的参数


如评论所示:


不管怎样,这些方法中的每一个都是不同的签名,因此您有一个
Func
Func
Func
,因此您仍然会得到一个if语句


调用该方法时是否可以返回Func?这样,我就可以根据快速切换情况返回三个func中的任意一个。问题是(如果可能的话)返回这三种方法之一的方法的泛型响应(或通用响应)类型是什么?泛型函数的工作方式如下: 您在Func中定义的最后一个数据类型在本例中为“output”,它应该是要指向该特定函数的方法的返回类型,并且该方法也应该是静态的。 这可能有助于:

Func<LogInType, string> Login = LoginMethod;

private static string LoginMethod(LogInType loginType)
{
    if (loginType == LogInType.Facebook)
        return "Facebook";
    if (loginType == LogInType.GooglePlus)
        return "GooglePlus";
    if (loginType == LogInType.UserNameAndPassword)
        return "UserNameAndPassword";
    return "Default";
}
Func Login=Login方法;
私有静态字符串登录方法(LogInType LogInType)
{
if(loginType==loginType.Facebook)
返回“Facebook”;
if(loginType==loginType.GooglePlus)
返回“GooglePlus”;
如果(loginType==loginType.UserName和Password)
返回“用户名和密码”;
返回“默认”;
}

上面示例中的返回类型是字符串,只是为了解释。

与其传递枚举并争先恐后地将参数输入到方法中,为什么不创建一个抽象参数类并为三个登录变量中的每一个创建子类?这些方法中的每一个都是不同的签名,因此您有一个
Func
Func
Func
这样你仍然会得到一个if语句。@Kempeth我试过了,但它与我遇到的Func相比没有太大区别。@DavidG调用该方法时我能返回一个Func吗?这样,我就可以根据快速开关盒返回三个
func
中的任意一个。问题是(如果可能的话)返回这三个methodsHow参数中任何一个的方法的泛型响应(或公共响应)类型是什么?如用户名或密码、IFacebook或iPlus?您可以使用用户名和密码声明一个公共父接口(例如:ILoginDetails)。为每个接口继承此接口,并将其作为输入传递。您可以向func:FuncSo添加n个参数func LogIn=LogIn方法,其中
ILogInInputParameters
必须具有名为
LogInType
的属性?这就是你的意思吗?然后使用
is
并检查三种可能的情况。如果您愿意,可以这样做,我建议如下:Func最好将LogInType保留为单独的参数,因为login参数与登录类型无关。因此它只是一个空白界面
Func<LogInType, string> Login = LoginMethod;

private static string LoginMethod(LogInType loginType)
{
    if (loginType == LogInType.Facebook)
        return "Facebook";
    if (loginType == LogInType.GooglePlus)
        return "GooglePlus";
    if (loginType == LogInType.UserNameAndPassword)
        return "UserNameAndPassword";
    return "Default";
}