gpt4 book ai didi

c# - 如何编写通用方法来构建具有通用接口(interface)的数据列表?

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:28 26 4
gpt4 key购买 nike

我们将使用压缩的 json 字符串在我们的系统中存储/传递配置数据。

我们在所有数据类的接口(interface)(IData)中添加了fromJson和toJson两个方法。我们已经构建了一个通用方法来将此类数据列表转换为 json,如下所示:

public static dynamic List2Json(List<IData> data)
{
List<dynamic> json = new List<dynamic>();
foreach(IData o in data)
{
json.Add(o.toJson());
}
return json;
}

但是构建类似的方法将 json 数组转换回列表时存在问题。我们不能为接口(interface)创建对象。 (即 IData x = new IData();) 或者即使我们创建了一个基类,我们仍然不能这样做。

public void Json2List(ref List<IData> list, DynamicJsonArray json)
{
list = new List<IData>();
foreach(dynamic o in json)
{
IData x = new IData();
x.fromJson(o);
list.Add(x);
}
}

我们也尝试了下面的通用方法,但仍然无法通过 T x = new T(); 创建对象。

public void Json2List<T>(ref List<T> data, dynamic json) where T : IData
{
data = new List<T>();
foreach(dynamic o in json)
{
T x = new T();
x.fromJson(o);
data.Add(o);
}
}

我们还考虑了另一种方式,通过数据类的静态方法返回新实例。但不幸的是,接口(interface)不支持静态方法,基类中的静态方法不能被覆盖。所以我们仍然需要那个类的一个实例来创建另一个实例。最后,我们做了一个愚蠢的方法,需要一个所需类的实例作为参数,并使用这个虚拟实例来生成列表的所有实例。

  public interface IData
{
IData createFromJson(dynamic json);
dynamic toJson();
}

public abstract class baseData : IData
{
public virtual IData objectFromJson(dynamic json, baseData source)
{
return source.createFromJson(json);
}
public abstract IData createFromJson(dynamic json);
}

public static void Json2List<T>(ref List<T> data, dynamic json, baseData source) where T : IData
{
data = new List<T>();
foreach(dynamic o in json)
{
data.Add(source.objectFromJson(o, source));
}
}

public class a : baseData
{
public override IData createFromJson(dynamic json)
{
a object = new a();
// assign the value to object from json here
return object;
}
}

// in the program need to convert from json
//
dynamic json = ... // json object containing required data
List<a> list = new List<a>();
Json2List(ref list, json, new a());

现在可以了,但是在调用方法时需要创建一个虚拟对象。

即Json2List(ref list, json, new a());在上面的例子中。它真的是虚拟的,我们只需要这个实例来调用 createFromJson 方法。

请问有没有什么办法可以改进程序,这样就不需要用这种方式构建虚拟对象了?

最佳答案

这应该可以通过结合泛型和 where 中的 new() 子句来实现。后者告诉编译器允许对泛型类型进行 new。您必须确保泛型类型具有不带参数的构造函数。

public void Json2List<T>(...) where T : IData, new()
{
data = new T() as IData;
...
}

关于c# - 如何编写通用方法来构建具有通用接口(interface)的数据列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37477118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com