[英]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));
或者,如果dtoType
是Type
实例,则只需
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.