繁体   English   中英

将(本地)变量作为类型传递给泛型方法

[英]Passing a (local) variable to a generic method as Type

我想做的事情,非常简短的版本摘要:

var localType = typeof(MyDTOClass);
var result = MyGenericMethod<localType>(string path);

VisualStudio告诉我dtoType是可变的,但像类型一样使用。

长版:我有以下字典,该字典用于从磁盘读取某些文件,然后使用(反)序列化器将其转换为对象。 json文件的内容几乎相同,因此我仅举一个例子:Json目录,对象数组:

[{
"id": "1",
"areaType": "2",
"backgroundImagePath": "path",}, {
"id": "2",
"areaType": "2",
"backgroundImagePath": "path",}, {
"id": "99",
"areaType": "1",
"backgroundImagePath": "path",}]

词典内容:

var filesToParse = new Dictionary<string, Type>{
    { "area.json",typeof(AreaDto) },
    { "areaObject.json",typeof(AreaObjectDto) },
    { "monsterSymbol.json",typeof(MonsterSymbolDto) },
};

检索json内容内容的代码:

IEnumerable GetDeserializedJson(string pathToJsonFile, Type dtoType) {
    IEnumerable result;
    using (TextReader file = File.OpenText(pathToJsonFile)) {
    result = JsonSerializer.DeserializeFromReader<IEnumerable<dtoType>>(file);
    }
    return result.OfType<dtoType>.Where(x => x != null);
}

我的问题是以下几行

result = JsonSerializer.DeserializeFromReader<dtoType>(file);
result.OfType<dtoType>.Where(x => x != null);

dtoType是变量,但像类型一样使用。 我知道这是一个变量,但它是Type的变量。 您能否解释一下为什么我不能传递此类型变量,如果可能的话,如何进一步解决我的问题? 以下是我(想)如何调用我的GetDeserializedJson的方法

foreach(var keyValuePair in filesToParse){
    GetDeserializedJson<keyValuePair.Value>(keyValuePair.Key);
}

提前致谢

只需使用非通用的DeserializeFromReader(reader, Type)方法,它将返回一个object 像这样:

result = JsonSerializer.DeserializeFromReader(file, typeof(dtotype));

或者,如果dtoTypeType实例,则只需

result = JsonSerializer.DeserializeFromReader(file, dtotype);

您必须决定是否要使用泛型或类型,但是不能即时“切换”到泛型。 说到这个例子

var localType = typeof(MyDTOClass);
var result = MyGenericMethod<localType>(string path);

您只是不需要第一行,而是

 var result = MyGenericMethod<MyDTOClass>(string path);

谈到其他样品

IEnumerable GetDeserializedJson(string pathToJsonFile, Type dtoType) 
{
     IEnumerable result;
     using (TextReader file = File.OpenText(pathToJsonFile)) 
     {
          result = JsonSerializer.DeserializeFromReader<IEnumerable<dtoType>>(file);
     }
     return result.OfType<dtoType>.Where(x => x != null);
}

您可以改为声明通用方法:

IEnumerable<TDto> GetDeserializedJson<TDto>(string pathToJsonFile) where TDto : DtoBaseClass
{
     IEnumerable<TDto> result;
     using (TextReader file = File.OpenText(pathToJsonFile)) 
     {
          result = JsonSerializer.DeserializeFromReader<IEnumerable<TDto>>(file);
     }
     return result.OfType<TDto>.Where(x => x != null);
}

这样,您甚至不必where TDto : DtoBaseClass为类型,并且where TDto : DtoBaseClass具有约束where TDto : DtoBaseClass因此编译器将不允许您使用类,这些类不是从您的基本dto类派生的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM