在电子表格的一列中搜索时,我注意到当第二行遇到空白字段时,它会例外(“可为空的对象必须有一个值。”),但是第一行会成功。我必须将Bool
类型转换添加到第二行,因为否则会出现“无法将Nullable
keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => cell.Value?.ToString() == field.Key);
keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => (bool)cell.Value?.ToString().Equals(field.Key, StringComparison.OrdinalIgnoreCase));
答案 0 :(得分:1)
这里发生的是,如果?.
运算符的左侧为null
,则会立即返回null
。
因此,当cell.Value
为null
时,第一行有效,因为您正在使用==
运算符进行直接比较,该运算符将返回bool
。换句话说,null == field.Key
返回false
(当然,除非field.Key
是null
)。
第二行在没有强制转换的情况下不起作用,因为如果值是null
,则?.
运算符将返回null
,其余行将被忽略({{1} }永远不会被调用)。因此,您得到的异常是由于.ToString()
条件必须返回if
,而实际上却返回了bool
。
解决此问题的一种方法是先简单地检查Nullable<bool>
。这不会比较null
处的任何对象:
cell.Value == null
执行此操作的另一种方法是使用keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell =>
cell.Value != null &&
cell.Value.ToString().Equals(field.Key, StringComparison.OrdinalIgnoreCase));
类的静态Equals
方法,该方法将允许一个或多个string
参数。这将包括null
处的结果(对于cell.Value == null
也是field.Key
的情况将返回true):
null
答案 1 :(得分:1)
在EPPlus和Excel Interop中,如果要对单元格的可见内容进行操作并避免为空,则可以使用Text
属性而不是Value
属性来读取单元格的内容。 Value
返回的object
可能为空,但是Text
返回的可见文本为string
,可以为空,但不能为空。
如果我们使用的是Value.ToString()
或Value?.ToString()
,那么使用Text
可能会更好,因为这是我们想要看到的文字而不是价值的赠品。
答案 2 :(得分:0)
也许尝试:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
//Get the key from configuration file section
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
var key = Encoding.ASCII.GetBytes(appSettings.Secret);
//jwt configuration
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x => {
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//Configuration of cors to allow request of anothers
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
//Use the authentication service
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseMvc();
}