我有一个看起来像这样的方法(假设我有必要的方法GetMySerializedDataArry()和我的序列化器JsonSerializer):

    public static List<T> GetMyListOfData<T>()
    {
        var msgList = new List<T>();

        foreach (string s in GetMySerializedDataArray())
        {
            msgList.Add(JsonSerializer.Deserialize<T>(s));
        }

        return msgList;
    }


这工作正常,并且符合预期。

但是,我希望使用相同的方法来选择,当且仅当将泛型类型指定为字符串时,才返回未序列化的数据,如下所示(它不会编译并且存在语法问题):

    public static List<T> GetMyListOfData<T>(bool leaveSerialized)
    {
        if (typeof (T) != typeof(string) && leaveSerialized)
        {
            throw new ArgumentException("Parameter must be false when generic type is not List<string>", "leaveSerialized");
        }

        var msgList = new List<T>();

        foreach (string s in GetMySerializedDataArray())
        {
            if (leaveSerialized)
            {
                // Casting does not work:  "Cannot cast expression of type 'System.Collections.Generic.List<T>' to type 'List<string>'"
                // I've tried various permutations of "is" and "as"... but they don't work with generic types
                // But I know in this case that I DO have a list of strings..... just the compiler doesn't.
                // How do I assure the compiler?

                ((List<string>)msgList).Add(s);
            }
            else
            {
                msgList.Add(JsonSerializer.Deserialize<T>(s));
            }
        }

        return msgList;
    }


我的问题在内联注释中。...尽管编译器显然不喜欢将泛型转换为非泛型,但是我也不会使用“ is”和“ are”运算符的排列在这种情况下,我实际上具有正确的字符串。...如何确保编译器正常?

提前谢谢了。

编辑:解决方案

感谢Lee和Lorentz,两者。我将创建两个公共方法,但是使用一个私有的方法来实现代码,该方法带有公认的关于是否要离开序列化的棘手的决策树。我的理由是,我的实际方法要比这里给SO提出的方法复杂得多,并且我不想重复这些业务规则。

最终编辑:更改的解决方案

尽管这两个答案都非常有帮助,但是我现在能够理清业务规则,因此对我来说,“正确”答案现在是第一个-两种不同的方法。再次感谢大家。

最佳答案

您不应该将字符串列表作为T的列表返回。我建议您使用两种单独的方法并跳过参数:

public static List<T> GetMyListOfData<T>()

public static List<string> GetSerializedMyListOfData()


这种方法的优点是


(imo)GetSerializedMyListOfData()GetMyListOfData<string>(true)更具可读性
您还知道了调用方在编译时的意图,并且当type参数与意图不匹配而使数据保持序列化时不必抛出异常

关于c# - 如何将泛型类型转换为非泛型类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22670776/

10-16 07:24