我正在尝试学习tweetinvi
凭据,因此我有以下用户界面
以及这两种方法,initAuthentication
和startAuthentication
private void initAuthentication()
{
var appCredentials = new TwitterCredentials(consumerKey, consumerSecret);
var authenticationContext = AuthFlow.InitAuthentication(appCredentials);
Process.Start(authenticationContext.AuthorizationURL);
//i am commenting the following code
//var userCredentials = AuthFlow.CreateCredentialsFromVerifierCode(textBox1.Text, authenticationContext);
//Auth.SetCredentials(userCredentials);
//so the user have some time to copy the pinCode
//paste them into available textbox
// and continue executing startAuthentication() by clicking authenticate button.
}
private void startAuthentication (string pinCode)
{
//if we split like this, the authenticationContext is error, because it doesn't exist in current context
var userCredentials = AuthFlow.CreateCredentialsFromVerifierCode(pinCode, authenticationContext);
Auth.SetCredentials(userCredentials);
}
如果我们将两个部分都加入到一个函数中,则用户没有时间将密码粘贴到文本框中。
但是,如果我们将这两个部分拆分为不同的功能,那么用户有时间将密码粘贴到文本框中,但似乎authenticationContext
出错,因为it doesn't exist in current context
有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
我不确定这个API应该如何工作,但是在方法中创建的变量的范围仅存在于该方法中。
您有两种选择:
创建AuthFlow.InitAuthentication(appCredentials);
返回的任何类型的类变量,在第一个方法中设置它,然后您可以从第二个方法访问它。
将AuthFlow.InitAuthentication(appCredentials);
的返回类型的参数添加到第二个方法,然后在调用第二个方法时传入上下文。
修改强>
考虑到这一点,上下文通常是你需要传递的东西,所以选项1可能会更好。
修改2
我查了一下,InitAuthentication
返回IAuthenticationContext
。所以在你的方法之外创建一个类变量,比如
IAuthenticationContext _authContext;
然后在方法一中
_authContext = AuthFlow.InitAuthentication(appCredentials);
然后在方法二中
var userCredentials = AuthFlow.CreateCredentialsFromVerifierCode(pinCode, _authContext);
还回答有关var
的问题......
var基本上是创建变量的简写,而不必每次都输入类型。然而,对var
的一个警告是,它所使用的变量必须被赋予一些值,否则var无法推断底层类型,你将得到编译器错误。
例如
var myVariable1;
或
var myVariable1 = null;
将抛出编译时错误,因为编译器无法推断myVariable1
的类型应该是什么。
正确的语法是
var myVariable1 = 4;
或者
var myVariable1 = "hello world";
或者
var myVariable1 = SomeMethodThatReturnsSomething();
答案 1 :(得分:0)
创建类字段而不是局部变量
class ClassName
{
AuthenticationContext authenticationContext;
private void initAuth()
{
// set authenticationContext
authenticationContext = AuthFlow.InitAuthentication(appCredentials);
}
private void startAuth(string pin)
{
// use authenticationContext
}
}