我有一个对象(这个例子保持简单),例如:
public class MyObject
{
public ICollection<OtherObject> OtherObjects { get; set; }
}
public class OtherObject
{
public bool IsValid() { return true; }
}
Run Code Online (Sandbox Code Playgroud)
目前在我的代码中我做:
bool ok = false;
if (myObject.OtherObjects != null && myObject.OtherObjects.Count > 0)
{
var last = myObject.OtherObjects.Last();
ok = last.IsValid();
}
Run Code Online (Sandbox Code Playgroud)
现在,使用C#6.0,可以在一行代码中执行此操作:
bool? ok = myObject.OtherObjects?.Last()?.IsValid();
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,null条件运算符将不起作用,因为上面的返回异常
序列不包含任何元素.
所以在这种情况下,我是否仍然需要使用旧方法来检查空值而不是使用空条件运算符的新方法?
或者,还有更好的方法?
我的后端是在IIS下运行的ASPNet WebApi2并使用Windows Authentification.
我有2个客户:
WinForms:传递凭证很简单.我做以下事情:
var credentialCache = new CredentialCache();
credentialCache.Add(new Uri(uri.GetLeftPart(UriPartial.Authority)), "NTLM", credentials);
WebRequestHandler handler = new WebRequestHandler()
{
AuthenticationLevel = AuthenticationLevel.MutualAuthRequested,
Credentials = credentialCache,
PreAuthenticate = true,
UseDefaultCredentials = false
};
client = new HttpClient(handler, true)
{
BaseAddress = uri,
};
Run Code Online (Sandbox Code Playgroud)Angular:由于最终用户将使用非Windows系统中的Angular应用程序访问WebApi后端,如何通过他/她的Windows凭据?(我有一个登录界面,用户必须输入他的域名/密码).
我想通过代码传递用户凭据.像typed_rest-client这样的东西.不幸的是,这个lib导致了构建错误,无法使用.
我有以下脚本:
DECLARE @columns TABLE (
Caption varchar(50),
Width int);
INSERT INTO @columns
VALUES ('Id', 0), ('Name', 100);
DECLARE @rows TABLE (
Id int,
[Name] varchar(50));
INSERT INTO @rows
VALUES (1, 'John'), (2, 'Steve');
SELECT *,
(SELECT *
FROM @rows
FOR XML PATH('Row'), ROOT('Rows'), TYPE, ELEMENTS)
FROM @columns
FOR XML PATH('Column'), ROOT('Results'), TYPE, ELEMENTS;
Run Code Online (Sandbox Code Playgroud)
我需要返回以下XML:
<Results>
<Columns>
<Column>
<Caption>Id</Caption>
<Width>0</Width>
</Column>
<Column>
<Caption>Name</Caption>
<Width>100</Width>
</Column>
</Columns>
<Rows>
<Row>
<Id>1</Id>
<Name>John</Name>
</Row>
<Row>
<Id>2</Id>
<Name>Steve</Name>
</Row>
</Rows>
</Results>
Run Code Online (Sandbox Code Playgroud)
我的想法是,我将XML转换为DataSet2 DataTables …
我有以下型号:
public class Customer
{
public int Id {get; set;}
public string Name {get; set;}
public int AddressId {get; set;}
public virtual Address Address {get; set;}
public virtual ICollection<CustomerCategory> Categories {get; set;}
}
public class CustomerCategory
{
public int Id {get; set;}
public int CustomerId {get; set;}
public int CategoryId {get; set;}
public virtual Category Category {get; set;}
}
public class Address
{
public int Id {get; set;}
public string Street{get; set;}
public virtual PostCode PostCode {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
从上面,并使用GraphDiff,我想更新客户聚合如下: …
我想在我的操作栏中添加一个删除图标(垃圾桶).它是应用程序可以使用的默认图标,还是应用程序本身的图标应该是可绘制的?
我一直在使用(成功)以下验证:
RuleFor(x => x.Items)
.SetCollectionValidator(new ItemValidator())
.Must(coll => coll.Sum(item => item.Percentage) == 100)
.When(x => x.Items != null);
Run Code Online (Sandbox Code Playgroud)
由于上述SetCollectionValidator内容(将)被弃用,我将其更改为:
RuleForEach(x => x.Items)
.SetValidator(new ItemValidator())
.Must(coll => coll.Sum(item => item.Percentage) == 100)
.When(x => x.Items != null);
Run Code Online (Sandbox Code Playgroud)
然而,Sum已经不被认可了。
我怎样才能解决这个问题?
我有一个包含文本框和按钮的自定义控件.我使用自定义控件作为ObjectListView中特定列的编辑控件.
在CellEditStarting事件上我做:
private void datalistViewProducts_CellEditStarting(object sender, CellEditEventArgs e)
{
var ctl = (MyCustomControl)e.Control;
e.Control = ctl;
}
Run Code Online (Sandbox Code Playgroud)
ObjectListView的ConfigureControl方法已经调用了控件的Select方法.如果我有一个直接从标准TextBox继承的usercontrol,它工作正常.
所以我将以下代码添加到我的usercontrol:
public new void Select()
{
textBox.Select();
}
Run Code Online (Sandbox Code Playgroud)
但是,如上所述具有用户控件,该Select方法不会将焦点移动到文本框.
我在这里错过了什么?
我有一个带有webbrowser控件的Windows窗体.使用此控件,我需要登录网站,并获取和发布数据.
登录部分将保持手动,因为各种标题和cookie已创建并存储.
但是,是否可以使用控件发送post/get请求?
我需要以编程方式重新启动应用程序.我的启动器活动称为" 登录 ",登录后,主要活动称为" 主要 ".在主要活动中,我想重新启动应用程序.所以我有以下内容:
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
这将显示"登录"活动,但是当我按下时,我将返回上一个活动.
有没有更好的方法来真正重启应用程序?
我正在重构我的代码以使用Refit来调用 WebApi 服务。接口已设置,我还创建了一个委托处理程序:
public class AuthHandler : DelegatingHandler
{
private readonly TokenProvider tokenProvider;
private readonly ISessionStorageService sessionStorage;
public AuthHandler (
TokenProvider tokenProvider,
ISessionStorageService sessionStorage)
{
this.tokenProvider = tokenProvider ?? throw new ArgumentNullException(nameof(tokenProvider));
this.sessionStorage = sessionStorage ?? throw new ArgumentNullException(nameof(sessionStorage));
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken ct)
{
var someToken = await sessionStorage.GetItemAsync<string>("sometoken");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenProvider.AccessToken);
request.Headers.Add("someToken", someToken);
return await base.SendAsync(request, ct).ConfigureAwait(false);
}
}
Run Code Online (Sandbox Code Playgroud)
并在Startup.cs:
services.AddBlazoredSessionStorage();
services.AddScoped<TokenProvider>();
services.AddScoped<AuthHandler>();
services.AddRefitClient<IApiService>().ConfigureHttpClient(options =>
{
options.BaseAddress = …Run Code Online (Sandbox Code Playgroud)