反射-从类型到类(不是类的实例)

时间:2018-12-05 01:00:22

标签: c# reflection json-deserialization

我该如何写这样的东西?

string json = null;
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
var carTypes = (from type in types
                 where type.IsClass && type == typeof(Car)
                 select type);
foreach(var carType in carTypes )
{
    string typeName = carType .Name;
    string jsonFile = typeName + ".json";
    json = File.ReadAllText(jsonFile);

    // How can I not hardcode "Porche" here and instead use "carType"?
    IList<Porche> cars = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Porche>>(json);
}

此处,保时捷汽车的子类-“ 保时捷”和“ 汽车”都是课程。除了保时捷,我们还有Toyata,宝马,特斯拉...我想通过反射来动态检索它们(避免硬编码) “汽车” 汽车实例的列表。

汽车类型”是类型。 如何在以List为参数的JsonConvert.DerserializeObject中使用“ carType”?

IList<someReflectionAPI(carType)> cars = Newtonsoft.Json.JsonConvert.DeserializeObject<List<someReflectionAPI(carType)>>(json);

谢谢

1 个答案:

答案 0 :(得分:2)

您可以在运行时使用MakeGenericType创建泛型,并使用DeserializeObject的非泛型重载:

var listOfType = typeof(List<>).MakeGenericType(carType);
var cars = JsonConvert.DeserializeObject(json, listOfType);