使用List of和undefined类型作为参数并返回类型

时间:2017-02-02 11:43:03

标签: c# generics c#-4.0

我正在尝试创建一个方法,该方法将列表中的文件位置作为参数,并返回该用户定义类型的列表。我已经创建了一个返回类型属性的方法,但我想使用属性的名称来尝试将它们匹配到.json文件中的键。

我已经让代码工作了,但是只有明确说明了类型。我有一个名为Item的用户定义类型,如下所示:

public class Item
{
    public int ID { get; set; }
    public string Name { get; set; }
    public double Weight { get; set; }
    public int Value { get; set; }

    public Item(int id, string name, double weight, int value)
    {
        ID = id;
        Name = name;
        Weight = weight;
        Value = value;
    }
}

这很好,但在某些时候,我可能希望对另一个用户定义类型的列表使用相同的过程,例如:

public class Car
{
    public string Registration { get; set; }
    public string Model { get; set; }
    public float TopSpeed { get; set; }

    public Item(string registration, string model, float topSpeed, int value)
    {
        Registration = registration;
        Model = model;
        TopSpeed = topSpeed;
    }
}

这可能还是我错过了什么?我是否必须创建一个重复的方法,唯一不同的是列表的类型?这是我的代码的一部分,我希望解释我想要实现的目标:

using System.Collections;
using System.Collections.Generic;
using LitJson;
using System.IO;
using System;
using System.Linq;
using System.Reflection;

namespace Program
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            DataParser dataParser = new DataParser();
            List<Item> database = new List<Item>();
            string location = "/Items.json";
            database = dataParser.ConstructItemDatabase(database, location);
        }
    }

    public class DataParser
    {
        public List<IndefiniteType> ConstructItemDatabase(List<IndefiniteType> list, string fileLocation)
        {
            //search property names of the list type and add create new objects within the list, based on the file.

            return list;
        }
    }
}

非常感谢。

2 个答案:

答案 0 :(得分:1)

我真的不明白你如何使用input,但你可以使用通用方法来实现你想要的目标:

$('#documentlist').on('input', '.selectdocument', function () {
    alert($(this).closest('.col-lg-12').attr('id'));
});

fileLocation是您想要的类型的占位符。

public static List<T> ConstructItemDatabase<T>(List<T> list, string fileLocation) where T : new() { // add new Item list.Add(new T()); // if you need a list of all the properties: PropertyInfo [] allProperties = typeof(T).GetProperties(); return list; } 将类型限制为仅具有无参数构造函数的类型。所以你可以肯定,可以创建一个新的实例

答案 1 :(得分:1)

您可能正在寻找Generics和Newtonsoft JS序列化器:

public class DataParser
{
    // to deserialize database from file
    public T ConstructItemDatabase<T>(string fileLocation)
    {
        var json = File.ReadAllText(fileLocation);

        return JsonConvert.DeserializeObject<T>(json);
    }

    // to serialize (save) database to a file
    public void SaveItemDatabaseToJson<T>(string fileLocation, T database)
    {
        var json = JsonConvert.SerializeObject(database);

        File.WriteAllText(fileLocation, json);
    }
}

使用示例:

var parser = new DataParser();

parser.SaveItemDatabaseToJson("myDb.json", myListToSerialize);

var myDesirializedList = parser.ConstructItemDatabase<List<Car>>("myDb.json");

P.S。

通过打开Nuget包管理器并在nuget.org上搜索它,将Newtonsoft.Json库添加到您的项目中。