首页 / C# / c# – Web API – 检测空赋值
c# – Web API – 检测空赋值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Web API – 检测空赋值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3308字,纯文字阅读大概需要5分钟。
内容图文
![c# – Web API – 检测空赋值](/upload/InfoBanner/zyjiaocheng/788/f4918a97c1764b4ca411152a7fac4368.jpg)
我正在尝试提出一种模式,可以检测属性何时设置为null.类似于Nullable< T>的东西.上课,但更先进一点.我们称之为MoreThanNullable< T>.基本上我需要根据以下3种情况做一些不同的事情:
>该物业从未设定过
>该属性设置为null
>该属性设置为T的实例.
我使用“实例化”属性创建了自己的类来完成此操作,并且它都在测试场景中工作.一些示例代码:
public struct MoreThanNullable<T>
{
private bool hasValue;
internal T value;
public bool Instantiated { get; set; }
public MoreThanNullable(T value)
{
this.value = value;
this.hasValue = true;
Instantiated = true;
}
// ... etc etc...
并且测试按照我的预期通过:
[TestFixture]
public class MoreThanNullableTests
{
public class AccountViewModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public MoreThanNullable<string> Test1 { get; set; }
public MoreThanNullable<string> Test2 { get; set; }
public MoreThanNullable<string> Test3 { get; set; }
}
[Test]
public void Tests()
{
var myClass = new AccountViewModel();
Assert.AreEqual(false, myClass.Test1.Instantiated);
myClass.Test1 = null;
Assert.AreEqual(true, myClass.Test1.Instantiated);
}
}
接下来,使用相同的视图模型,我将其连接到我的REST服务上的POST,然后传入以下JSON:
{
Name:"test",
Test1:null,
Test2:"test"
}
……一切都崩溃了. Test1和Test3都没有实例化!显然,我不希望Test3被实例化,但Test1仍未实例化是出乎意料的.实际上,我无法区分我通过REST获得和未获得的属性. (注意:在我们的应用程序中,未设置和设置为null之间存在明显差异)
我做错了吗?或者这是Web API的正确行为?
**更新**
我可能没有说清楚的是,我已经有效地复制了Nullable< T>.用于实现此目的的类,包括重载隐式运算符,如下所示:
public static implicit operator MoreThanNullable<T>(T value)
{
return new MoreThanNullable<T>(value);
}
在我的问题中,我似乎总是遗漏重要的东西……
解决方法:
为什么不起作用?在你的JSON中
{
Name:"test",
Test1:null,
Test2:"test"
}
Test1结束Test2是原始类型,但是你创建了自己的类型,它们应该映射到它们的属性,因此它不再是原始的,而是一个复杂的对象.所以你的JSON实际上也应该包含对象.如果你改成它,它会工作
{
Name:"test",
Test1:{Instantiated:false, value: null},
Test2:{Instantiated:false, value: "test"},
}
因为现在它们是对象并且反序列化.你的struct也有一个默认的空构造函数,如果它是一个带有私有默认构造函数的类,它将无法再次运行.
现在,如何获得像字符串这样的原始类型来反序列化到自定义类型?您可以使用自定义web api action filter执行此操作并解析传入的json并将其映射到OnActionExecuting中的对象.
编辑2
假设您使用的是JSON.NET from newtonsoft,则可以插入自定义JSON转换器.这将是Web api应用程序的全局变更,无需自定义过滤器.
public sealed class MoreThanNullableConverter : Newtonsoft.Json.JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof (MoreThanNullable<>);
}
public override bool CanWrite { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// return a new MoreThanNullable instance with value
return Activator.CreateInstance(objectType, reader.Value);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
更改为webapiconfig.cs
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
jsonFormatter.SerializerSettings.Converters.Add(new MoreThanNullableConverter());
内容总结
以上是互联网集市为您收集整理的c# – Web API – 检测空赋值全部内容,希望文章能够帮你解决c# – Web API – 检测空赋值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。