【问题标题】:Using Func<T,TResult> c#使用 Func<T,TResult> c#
【发布时间】:2017-04-26 09:34:56
【问题描述】:

我正在开发 PCL,它除了提供许多功能外还提供登录功能。另外,我最近开始使用代理。

当前案例:

我有一个 Simple 方法,它接受参数并提供 GPlus、Facebook 或 Simple logIn 以及用户名和密码。如下代码:

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
}

这很好,我可以直接从我的应用程序中调用它们并处理数据,但是, 我最近遇到了DelegatesFunc&lt;T,TResult&gt;

我想做什么:

我想要一个简单的方法,它接受LogInType 的枚举参数,如下所示:

public enum LogInType
{
    UserNameAndPassword,
    Facebook,
    GooglePlus,
}

并根据提供给方法的登录类型的类型,自行处理登录过程并仅返回SignInResponse 对象。


有没有一种方法可以使用委托来完成。而不是为每个案例调用 3 个单独的方法。如果是,那么有人可以帮助将参数与 LogInType 一起传递给 Single 方法。我知道它必须是 Func,但 Func 看起来像什么,因为它必须采用 3 个不同的参数。


来自评论:

这些方法中的每一个都是不同的签名,所以你有一个Func&lt;IFacebookInitializerTask&lt;SignInResponse&gt;&gt;Func&lt;string, string, Task&lt;SignInResponse&gt;&gt;Func&lt;IGPlusInitializer, Task&lt;SignInResponse&gt;&gt;,所以你仍然会得到一个 if 语句。

我可以在调用方法时返回 Func 吗?通过这种方式,我可以基于快速切换案例返回三个 func 中的任何一个。问题是(如果可能的话)返回这三种方法中的任何一种的方法的通用响应(或通用响应)类型是什么

【问题讨论】:

  • 与其传递一个枚举并争先恐后地将参数获取到方法中,为什么不创建一个抽象参数类并为三个登录变体中的每一个创建一个子类?
  • 这些方法中的每一个都是不同的签名,所以你有一个Func&lt;IFacebookInitializer, Task&lt;SignInResponse&gt;&gt;Func&lt;string, string, Task&lt;SignInResponse&gt;&gt;Func&lt;IGPlusInitializer, Task&lt;SignInResponse&gt;&gt;,所以你仍然会得到一个 if 语句。
  • @Kempeth 我确实尝试过,但与我遇到的 Func 相比,它并没有太大的不同。
  • @DavidG 调用该方法时我可以返回一个 Func 吗?通过这种方式,我可以根据快速切换案例返回三个func 中的任何一个。问题将是(如果可能的话)返回这三种方法中的任何一种的方法的通用响应(或通用响应)类型是什么

标签: c# delegates func


【解决方案1】:

通用 Func 的工作原理如下: 您在 Func 中定义的最后一个数据类型 - 在这种情况下,“输出”应该是您要转到该特定函数的方法的返回类型,并且该方法也应该是静态的。 这可能会有所帮助:

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

上面例子中的返回类型是字符串,只是为了说明。

【讨论】:

  • 我应该如何传入参数?比如用户名或密码或 IFacebook 或 IGPlus?
  • 您可以使用用户名和密码声明一个公共父接口(例如:ILoginDetails)。为每个接口继承此接口并将其作为输入传递。您可以在 func 中添加 n 个参数:Func
  • 所以一个 Func LogIn = LoginMethod 其中ILogInInputParameters 必须有一个名为LogInType 的属性?你是这个意思吗?然后使用is 并检查三种可能的情况
  • 如果你愿意,你可以这样做,我建议如下: Func 最好将 LogInType 保留为单独的参数,因为登录参数与登录参数无关登录类型。
  • 所以它只是一个空白界面
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
相关资源
最近更新 更多