【发布时间】:2019-08-01 19:36:07
【问题描述】:
我有一个 Json 类“GetAllDevices()”。我的 JSON 响应由一个对象数组/列表组成,其中每个对象都具有以下常见属性。
public class GetAllDevices
{
[JsonProperty("_id")]
public string Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("actions")]
public Action[] Actions { get; set; }
public class Action
{
public string _id { get; set; }
public Action_Def action_def { get; set; }
}
public class Action_Def
{
public string _id { get; set; }
public string name { get; set; }
}
}
我想创建 2 个通用列表,其中包含基于其“类型”的所有上述属性。 lstfoo1 列表包含 type="foo1" 的所有属性(_id、名称类型和操作)。同样,lstfoo2 是一个 List,其中包含上述属性,其中 type="foo2"。
到目前为止我做了什么:
string strJson=getJSON();
Foo1 lstfoo1=new Foo1();
Foo2 lstfoo2=new Foo2();
List<Foo1> foo1list= lstfoo1.GetDeviceData(strJson);
List<Foo2> foo2list = lstfoo2.GetDeviceData(strJson);
public class AllFoo1: GetAllDevices
{
}
public class AllFoo2: GetAllDevices
{
}
public abstract class HomeDevices<T>
{
public string type { get; set; }
public string _id { get; set; }
public List<AllFoo1> lstfoo1{ get; set; }
public List<AllFoo2> lstfoo2{ get; set; }
public abstract List<T> GetDeviceData(string jsonResult);
}
public class Foo1: HomeDevices<AllFoo1>
{
public Foo1()
{
type = "foo1";
}
public override List<AllFoo1> GetDeviceData(string jsonResult)
{
var lst =Newtonsoft.Json.JsonConvert.DeserializeObject<List<AllFoo1>>(jsonResult);
var lst1 = lst.Where(x => x.Type.Equals(type)).ToList();
return lst1;
}
}
public class Foo2: HomeDevices<AllFoo2>
{
public Foo2()
{
type = "foo2";
}
public override List<AllFoo2> GetDeviceData(string jsonResult)
{
var lst = Newtonsoft.Json.JsonConvert.DeserializeObject<List<AllFoo2>>(jsonResult);
var lst1 = lst.Where(x => x.Type.Equals(type)).ToList();
return lst1;
}
}
我的问题是,有没有更简单的方法可以使用抽象类来做到这一点?我可以直接将我的“GetAllDevices”类转换为抽象类并继承它并反序列化并创建一个通用列表吗?
【问题讨论】:
-
GetDeviceData的实现看起来完全一样。你不能只在基类上实现它并在调用DeserializeObject时使用T作为参数吗? -
是的,您可以创建一个 List 并将任一类型的对象放入其中,但听起来您正在尝试将对象的属性而不是对象本身放入列表中,是吗正确的?在这种情况下,您可以只使用 List。您始终可以使用
getType来区分属性类型。 -
我猜他想在列表中强制执行类型
-
@ĴošħWilliard 我希望能够访问每个对象的所有属性。我对使用抽象类非常陌生。我看过各种例子,但不知道如何将我的放在其中。你能给我一个链接吗?
-
@JuanR 你能告诉我怎么做或者指向一个链接吗?
标签: c# json abstract-class generic-list