如何使用Dynamic进行回调?

cho*_*bo2 7 c# dynamic callback

我一直收到这个错误,不知道如何纠正它

错误1无法使用"回调"作为动态调度操作的参数,因为它是方法组.你打算调用这个方法吗?

    //...
    if (e.Status == LiveConnectSessionStatus.Connected)
    {              
        client = new LiveConnectClient(e.Session);
        LiveOperationResult operationResult = await client.GetAsync("me");
        try
        {

            dynamic meResult = operationResult.Result;

            var openId = meResult.id;
            var email = meResult.emails.preferred;
            //MessageBox.Show(openId);
            //MessageBox.Show(email);
           userService.SignIn(openId, email, Callback);


        }
        catch (LiveConnectException exception)
        {
            MessageBox.Show("Error calling API: " + exception.Message);
        }
    }
}

private void Callback(ErrorModel error)
{
    if (error != null)
    {
        MessageBox.Show(error.FriendlyErrorMsg, error.Caption, MessageBoxButton.OK);
    }
    else
    {

    }
}

public void SignIn(string id, string email, Action<ErrorModel> callBack)
{

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 12

问题是这个调用是动态的:

userService.SignIn(openId, email, Callback);
Run Code Online (Sandbox Code Playgroud)

它必须是,因为openId并email推断出类型dynamic:

var openId = meResult.id;
var email = meResult.emails.preferred;
Run Code Online (Sandbox Code Playgroud)

您不能在动态调用中使用这样的方法组转换 - 这只是使用的限制之一dynamic.

所以,选项:

  • 给定openId和email显式类型(如果userService不是dynamic)将使调用非动态,方法组转换将起作用.这只是意味着明确指定类型,因为可以从dynamic以下位置获得隐式转换:

    string openId = meResult.id;
    string email = meResult.emails.preferred;
    userService.SignIn(openId, email, Callback);
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果要保持呼叫动态,请从方法创建特定的委托类型实例:CallbackSignIn

    var openId = meResult.id;
    var email = meResult.emails.preferred;
    // Or use whichever delegate type is actually appropriate for SignIn
    userService.SignIn(openId, email, new Action<ErrorModel>(Callback));
    
    Run Code Online (Sandbox Code Playgroud)