Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使这个JSON加载方法通用_C#_Generics - Fatal编程技术网

C# 如何使这个JSON加载方法通用

C# 如何使这个JSON加载方法通用,c#,generics,C#,Generics,我有多个包含数据的JSON文件和多个属性映射到JSON文件中字段的类。我有一个加载JSON的通用方法,如下所示: public static TResult LoadFromJSON<TResult>(string pathToJSON) { using (var reader = new StreamReader(pathToJSON)) { var json = reader.ReadToEnd(); var records = J

我有多个包含数据的JSON文件和多个属性映射到JSON文件中字段的类。我有一个加载JSON的通用方法,如下所示:

public static TResult LoadFromJSON<TResult>(string pathToJSON)
{
    using (var reader = new StreamReader(pathToJSON))
    {
        var json = reader.ReadToEnd();
        var records = JsonConvert.DeserializeObject<TResult>(json);
        return records;
    }
}
    public <dynamicObject> GetJSONTestData()
    {
        var pathJSON = @"..\..\TestData\<dynamic json file>";
        var sortCriteriaJSON = TestDataLoader.LoadFromJSON<dynamicObject>(pathJSON);
        return sortCriteriaJSON;
    }
我想做的是使第二个方法成为泛型方法,这样我就可以动态地传递类(在两个位置)和json文件,而不是使用
SortingData
class(在两个位置)和
sortData.json
文件。。。。。因此,我不必为不同的类重复该方法。比如说:

public static TResult LoadFromJSON<TResult>(string pathToJSON)
{
    using (var reader = new StreamReader(pathToJSON))
    {
        var json = reader.ReadToEnd();
        var records = JsonConvert.DeserializeObject<TResult>(json);
        return records;
    }
}
    public <dynamicObject> GetJSONTestData()
    {
        var pathJSON = @"..\..\TestData\<dynamic json file>";
        var sortCriteriaJSON = TestDataLoader.LoadFromJSON<dynamicObject>(pathJSON);
        return sortCriteriaJSON;
    }
public GetJSONTestData()
{
var pathJSON=@“.\..\TestData\”;
var sortCriteriaJSON=TestDataLoader.LoadFromJSON(pathJSON);
返回sortCriteriaJSON;
}

我不知道该怎么办。有什么想法吗?

您可以使用
typeof
和字符串连接来实现这一点,如下所示:

public T GetJsonTestData()
{
//假设T是SortingData,这里的名称是“SortingData”
变量名称=类型(T)。名称;
//在此之后,名称为“sortingData”
name=Char.ToLowerInvariant(name[0])+name.Substring(1);
var path=$@“.\..\TestData\{name}”;
返回LoadFromJson(路径);
}
那么你可以这样称呼它:

//这将读取“.\..\TestData\sortingData.json”
var sortingData=GetJsonTestData();
//这将读取“.\..\TestData\fooBar.json”
var whather=GetJsonTestData();

听起来您希望能够将类型映射到文件名。您可以按照约定解析文件名,也可以通过一些配置加载映射

在下面的示例中,配置是硬编码的,但是从appSettings文件加载它不会太多(说明这超出了本问题的范围)。通过配置,从字典中获取文件名并将其传递给LoadFromJson非常简单

public class TestDataLoader
{
    private readonly string basePath = @"..\..\TestData";

    private readonly Dictionary<Type, string> fileNameRegistry = new() 
    {
        { typeof(SortingData), "sorting_data.json" }
    };

    public TResult GetJSONTestData<TResult>()
    {
        var typefileName = fileNameRegistry[typeof(TResult)];
        var path = Path.Combine(basePath, typeFileName);
        return LoadFromJSON<TResult>(path);
    }

    public static TResult LoadFromJSON<TResult>(string pathToJSON)
    {
        using (var reader = new StreamReader(pathToJSON))
        {
            var json = reader.ReadToEnd();
            var records = JsonConvert.DeserializeObject<TResult>(json);
            return records;
        }
    }

}
公共类TestDataLoader
{
专用只读字符串basePath=@“.\..\TestData”;
专用只读词典fileNameRegistry=new()
{
{typeof(SortingData),“sorting_data.json”}
};
public TResult GetJSONTestData()
{
var typefileName=fileNameRegistry[typeof(TResult)];
var path=path.Combine(basePath,typeFileName);
返回LoadFromJSON(路径);
}
公共静态TResult LoadFromJSON(字符串pathToJSON)
{
使用(var reader=newstreamreader(pathToJSON))
{
var json=reader.ReadToEnd();
var records=JsonConvert.DeserializeObject(json);
退货记录;
}
}
}

这几乎就是
LoadFromJSON
所做的,只是从类名派生文件名。我不明白为什么不能为GetJSONTestData创建GenericType。是否因为json文件与返回类型绑定?你需要把两者联系起来吗?谢谢你的回复。但是我很困惑,当使用这个时,我将在哪里传递SortingData对象和JSON文件?我在中间看到了你的评论,但我对如何将这些价值传递到哪里感到困惑。编辑,我想我明白了T'将变成'SortingData',其余的将级联?您可以这样简单地调用此方法:
var SortingData=GetJsonTestData()
,它将读取
SortingData.json
,调用
var whatever=GetJsonTestData()
会读到
fooBar.json
谢谢你这样为我解释。有道理!