小编Zok*_*oka的帖子

JSON.NET:如何根据父(持有者)对象值反序列化接口属性?

我有这样的课程

class Holder {
    public int ObjType { get; set; }
    public List<Base> Objects { get; set; }
}

abstract class Base {
    // ... doesn't matter
}

class DerivedType1 : Base {
    // ... doesn't matter
}

class DerivedType2 : Base {
    // ... doesn't matter
}
Run Code Online (Sandbox Code Playgroud)

使用WebAPI我想要接收对象Holder并正确反序列化它.基于ObjType值,我需要Objects将要反序列化的属性作为List<DerivedType1>(ObjType == 1)或List<DerivedType2>(ObjType == 2).

目前我搜索了SO和互联网以获得最佳方法,但我找到的最好的是这个答案/sf/answers/562189841/.这个解决方案的问题是,它松散了父对象的上下文,所以我找不到它的值ObjType.OK,我可以创建自定义解决它JsonConverter用于Holder和remebering的ObjType价值,但我还是很affraid这行

serializer.Populate(jObject.CreateReader(), target); …
Run Code Online (Sandbox Code Playgroud)

c# json.net asp.net-web-api json-deserialization

23
推荐指数
1
解决办法
1万
查看次数

实体框架:复合键的字段不能为空?

我有一个带有复合键的模型 - 行是关键:

public class Item
{
    [Key, Column(Order = 0)]
    public int UserId { get; set; }
    [Key, Column(Order = 1)]
    public DateTime? Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

运行下面的代码会抛出一个异常DbEntityValidationException消息The Date field is required.::

var it = new Item { Date = null, UserId = 2 };
m_Entities.Items.Add(it);
m_Entities.SaveChanges(); // throws exception
Run Code Online (Sandbox Code Playgroud)

(m_Entities通常是子DbContext项,定义为项目DbSet<Item>)Date如果可以null(声明为DateTime?),为什么需要?以及如何允许null成为有效值Date

c# entity-framework ef-code-first asp.net-mvc-3

17
推荐指数
1
解决办法
8095
查看次数

JSON.NET:JsonCreationConverter工作WriteJson实现

从这个答案我有类JsonCreationConverter<T>和具体类型的一些实现.但是这个抽象类错过了WriteJson方法的实现.

通过互联网我找到了代码:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    //use the default serialization - it works fine
    serializer.Serialize(writer, value);
}
Run Code Online (Sandbox Code Playgroud)

但是这个代码最终会出现StackOverflowException,因为它一直在调用自己(当然).其他解决方案用于具体对象实现,逐个序列化所有值.我真的想避免它,只想使用默认序列化,这对我来说没问题.只是为了避免调用我的JsonConverter进行序列化.我只需要反序列化.可能吗?怎么样?

c# serialization json.net

5
推荐指数
1
解决办法
2356
查看次数

C#:使用类泛型参数覆盖泛型方法

为什么这不可能?

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f()
    {
        return default (T);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:

does not implement inherited abstract member 'A.f<T>()'
no suitable method found to override
Run Code Online (Sandbox Code Playgroud)

我知道签名必须是相同的,但从我的角度来看,我认为没有理由这是不允许的.另外我知道另一个解决方案是制作A通用的,而不是它的方法,但由于某些原因它不适合我.

c# generics

4
推荐指数
1
解决办法
3751
查看次数

JSON.NET:如何反序列化特定的异常类型

考虑以下非常简单的代码。

var ex_to_serialize = new Exception("something wrong", new NullReferenceException("set to null"));
var serialized_ex = JsonConvert.SerializeObject(ex_to_serialize);

var deserialized_ex = JsonConvert.DeserializeObject<Exception>(serialized_ex);
Console.WriteLine($"Type of inner exception: {deserialized_ex.InnerException.GetType().Name}");
Run Code Online (Sandbox Code Playgroud)

瞧……内部异常类型Exception不是NullReferenceException. 所以我搜索了 SO 并找到了很多JsonConverter用于反序列化的自定义示例(因为序列化的 JSON 包含ClassName可用于创建特定类型的属性)。所以我写了一个(只是ReadJson为了简单起见,其余照常)。

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    if (reader.TokenType == JsonToken.Null)
        return null;
    var json_object = Newtonsoft.Json.Linq.JObject.Load(reader);
    var target_type_name = json_object.Value<string>("ClassName");
    var target_type = Type.GetType(target_type_name);
    var target = Activator.CreateInstance(target_type);
    serializer.Populate(json_object.CreateReader(), target);
    return target;
}
Run Code Online (Sandbox Code Playgroud)

并在调用 …

c# json.net json-deserialization

4
推荐指数
1
解决办法
2609
查看次数

多态绑定器:当自定义模型绑定包装在另一个类中时,验证不起作用

我对本文中的多态绑定示例进行了一些更改。

  1. 为各个类的和属性添加[Required]属性。CPUIndexScreenSizeLaptopSmartPhone
  2. 运行示例并创建任何类型的设备,无需填写 CPU 索引或屏幕尺寸。
  3. 它运行正确 - 模型已绑定并经过验证(向您显示错误,即“需要 CPU 索引/屏幕尺寸”。

到目前为止还可以。

现在添加新类:

public class DeviceWrapper
{
    public Device Device { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并修改AddDevice.cshtml.cs文件:

...
[BindProperty]
public DeviceWrapper Device { get; set; } // model type changed here

public IActionResult OnPost()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    switch (Device.Device) // added Device. prefix to respect new model structure
    {
        case Laptop laptop:
            Message = $"You added a Laptop with …
Run Code Online (Sandbox Code Playgroud)

c# model-binding model-validation asp.net-core

2
推荐指数
1
解决办法
800
查看次数