【问题标题】:How can I create object from constructors with parameters如何从带有参数的构造函数创建对象
【发布时间】:2021-03-26 13:43:13
【问题描述】:

此代码在默认构造函数中运行良好。如何从带参数的构造函数创建对象?

private readonly JsonSerializer _serializer;

private static readonly IReadOnlyDictionary<TypeId, Type> _derivedTypes;
        static ByTypeIdConverter()
        {
            var baseType = typeof(T);
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();

            _derivedTypes = (
                    from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
                    from assemblyType in domainAssembly.GetTypes()
                    where !assemblyType.IsAbstract && assemblyType.IsSubclassOf(baseType)
                    select assemblyType).ToDictionary(t => (TypeId)t);
        }

public override T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
    var jObject = JObject.Load(reader);
    var typeId = jObject["_t"]?.ToObject<TypeId>();

    if (typeId is null || !_derivedTypes.TryGetValue(typeId, out var classType))
        throw new JsonSerializationException("Failed to get derived class type from json or found type was not expected");

    var creator = _serializer.ContractResolver.ResolveContract(classType).DefaultCreator;

    if (creator is null)
    {
        throw new JsonSerializationException($"Failed create instance of type {classType.Name}");
    }

    var result = creator();
    _serializer.Populate(jObject.CreateReader(), result);

    return (T)result;
} 

一些附加信息我有 SomeBase 类和该基类的自定义 JsonConverter。我只是像这样反序列化:

JsonConvert.DeserializeObject<SomeBase>(jsonData);

【问题讨论】:

  • 你想从哪里得到那些构造函数参数值? json字符串中有没有?常量?
  • 这对您有帮助吗? stackoverflow.com/questions/23017716/…
  • 我添加了一些细节。也许这会更清楚问题
  • 是的,我已经看到了这个解决方案。还有其他解决方案吗?喜欢通用方式?在这个例子中,它是更多的静态定义
  • 如果你想使用构造函数初始化一个类。然后您可以将 JSON 解析为 JObject 并将所需的参数传递给构造函数。然后,如果您仍想复制所有值。您可以使用 PopulateObject 方法复制所有值。

标签: c# json json.net converters


【解决方案1】:

我创建了未初始化的对象。这帮助我解决了我的问题

if (creator is null)
                creator = () => RuntimeHelpers.GetUninitializedObject(classType);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2019-12-21
    • 2021-10-09
    • 2015-04-08
    • 2018-02-22
    相关资源
    最近更新 更多