如何检查T是否是通用方法中的对象列表

冷梦

我正在尝试使用Json.NET编写一种从json文件反序列化的通用方法,
我希望能够支持反序列化包含对象以及对象数组的文件。以下是我目前拥有的两种通用方法的简化版本:

/// <summary>   Deserializes object or an array of objects from a list of files. </summary>
public static List<T> Deserialize<T>(List<string> filePathsList)
{
    var result = new List<T>();
    foreach (var file in filePathsList)
        // HOW DO I FIND OUT IF T IS A LIST HERE?
        // Resharper says: the given expression is never of the provided type
        if (typeof(T) is List<object>)
        {
            var deserialized = Deserialize<List<T>>(file);
            result.AddRange(deserialized);
        }
        // Resharper says: Suspicious type check: there is not type in the solution
        // which is inherited from both 'System.Type' and 'System.Collections.IList'
        else if (typeof(T) is IList)
        {
            // deserializing json file with an array of objects
            var deserialized = Deserialize<List<T>>(file);
            result.AddRange(deserialized);
        }
        else
        {
            // deserializing a single object json file
            var deserialized = Deserialize<T>(file);
            result.Add(deserialized);
        }
    return result;
}


/// <summary>   Deserializes object or an array of objects from a file. </summary>
public static T Deserialize<T>(string filepath)
{
    return JsonConvert.DeserializeObject<T>(File.ReadAllText(filepath));
}

问题是反序列化之前,我需要知道T是对象还是对象列表如何在通用方法中检查?因为resharper会给我警告,而我似乎无法弄清楚。


编辑:我在示例代码中犯了一个错误,正如@ Medo42指出的那样,它将使用De调用Deserialize()。List<List<Something>>另外,我根本不应该包含一个涉及json序列化的示例,它应该更通用。问题是要找出T是否是对象列表。

在此先感谢您的帮助。

梅多42

这不是一个完整的答案,但是评论太长,可能有助于您更好地理解某些问题。

// Resharper says: the given expression is never of the provided type
if (typeof(T) is List<object>)

Resharper是对的。is运营商检查左边的实例是否是正确的类型,所以在你的情况下,它会检查,如果typeof(T)是的一个实例List<object>但是,typeof(T)返回一个代表的类型的Type实例正确的检查方式(如果您使用的是确切类型)是T

if (typeof(T) == typeof(List<object>))

但要注意的是,如果这仅适用T完全相同 List<object>如果还可以有的子类型List<object>,则该行为

if (typeof(List<object>).IsAssignableFrom(typeof(T)))

但是,您的问题并不止于此。您似乎假设这List<object>是所有列表的超类型。即使不是这样,即使我们可以假设我们只会使用List<T>列表实现。这样做的原因List<T>不变的

不变性意味着猫的列表不是哺乳动物的列表。如果这似乎违反直觉,那是因为您将列表视为要从中读取的固定集合。但是,您也可以将新项目添加到C#列表中,如果允许您将aList<Cat>视为a List<Mammal>,则可能最终尝试将大象添加到该列表中,这不会给仍然持有a的其他人带来混乱将该列表作为引用List<Cat>

对于类型检查问题的解决方案,我认为drf对dotctor答案的评论是做您想做的事情的最干净的方法:

typeof(T).GetGenericTypeDefinition() == typeof(List<>)

最后,下面的代码看起来也很奇怪:

var deserialized = Deserialize<List<T>>(file);

在确定T确实是a之后List<Something>,您可以执行此操作,因此现在尝试将文件反序列化为a List<List<Something>>,这可能不是您想要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何检查空列表是否在列表内的字典内并从列表中删除该字典对象?

来自分类Dev

在 VB 中检查通用对象是否相等

来自分类Dev

如何检查对象列表是否与列表列表不同?

来自分类Dev

如何使用C#检查对象列表中是否已存在对象

来自分类Dev

如何从对象中获取指定的字段,以检查列表是否包含()对象?订房验证问题

来自分类Dev

如何在通用方法中检查通用类型

来自分类Dev

检查键是否在Excel VBA中的集合中的通用方法

来自分类Dev

检查键是否在Excel VBA中的集合中的通用方法

来自分类Dev

检查对象列表中是否存在数组列表

来自分类Dev

检查对象列表中是否存在对象

来自分类Dev

检查对象列表中是否存在对象属性

来自分类Dev

如何检查对象方法是否存在?

来自分类Dev

检查范围是否在Scala中包含值的通用方法

来自分类Dev

如何制作在 GWT 中检查的对象列表?

来自分类Dev

如何检查Dart NNBD中的通用类型是否可为空?

来自分类Dev

如何检查输入的字母是否在列表中?

来自分类Dev

如何检查列表中是否存在整数?

来自分类Dev

如何检查列表中是否存在值?

来自分类Dev

如何检查数字是否在python列表中

来自分类Dev

如何检查列表中是否包含gameObject?

来自分类Dev

如何检查列表中是否输入

来自分类Dev

如何检查元素是否在列表中

来自分类Dev

如何检查某人是否在列表中

来自分类Dev

如何检查列表中是否存在整数?

来自分类Dev

如何检查号码是否在列表中

来自分类Dev

如何检查值是否是车把中的对象?

来自分类Dev

流口水,如何检查具有特定属性的对象是否在列表中多次存在

来自分类Dev

如何检查具有ID的对象数组中是否存在ID(在ID列表内)?

来自分类Dev

在Scala中,是否可以实例化通用类型T的对象?

Related 相关文章

  1. 1

    如何检查空列表是否在列表内的字典内并从列表中删除该字典对象?

  2. 2

    在 VB 中检查通用对象是否相等

  3. 3

    如何检查对象列表是否与列表列表不同?

  4. 4

    如何使用C#检查对象列表中是否已存在对象

  5. 5

    如何从对象中获取指定的字段,以检查列表是否包含()对象?订房验证问题

  6. 6

    如何在通用方法中检查通用类型

  7. 7

    检查键是否在Excel VBA中的集合中的通用方法

  8. 8

    检查键是否在Excel VBA中的集合中的通用方法

  9. 9

    检查对象列表中是否存在数组列表

  10. 10

    检查对象列表中是否存在对象

  11. 11

    检查对象列表中是否存在对象属性

  12. 12

    如何检查对象方法是否存在?

  13. 13

    检查范围是否在Scala中包含值的通用方法

  14. 14

    如何制作在 GWT 中检查的对象列表?

  15. 15

    如何检查Dart NNBD中的通用类型是否可为空?

  16. 16

    如何检查输入的字母是否在列表中?

  17. 17

    如何检查列表中是否存在整数?

  18. 18

    如何检查列表中是否存在值?

  19. 19

    如何检查数字是否在python列表中

  20. 20

    如何检查列表中是否包含gameObject?

  21. 21

    如何检查列表中是否输入

  22. 22

    如何检查元素是否在列表中

  23. 23

    如何检查某人是否在列表中

  24. 24

    如何检查列表中是否存在整数?

  25. 25

    如何检查号码是否在列表中

  26. 26

    如何检查值是否是车把中的对象?

  27. 27

    流口水,如何检查具有特定属性的对象是否在列表中多次存在

  28. 28

    如何检查具有ID的对象数组中是否存在ID(在ID列表内)?

  29. 29

    在Scala中,是否可以实例化通用类型T的对象?

热门标签

归档