1

我有这个通用扩展函数,它将具有特定父类型的对象转换为子类型(在此处找到代码:无法从父类转换为子类):

public static U ParentToChild<T, U>(this T parent) {
    if(!typeof(U).IsSubclassOf(typeof(T)))
        throw new Exception(typeof(U).Name + " isn't a subclass of " + typeof(T).Name);
    var serializedParent = JsonConvert.SerializeObject(parent);
    return JsonConvert.DeserializeObject<U>(serializedParent);
}

因此,当我调用此函数时,我需要指定 Parent 和 Child 类类型,例如:

Child child = parent.ParentToChild<Parent, Child>();

有什么办法可以避免“父”精度?

我想写这个:

Child child = parent.ParentToChild<Child>();
4

1 回答 1

0

您可以制作object参数类型并T完全删除类型参数:

public static U ParentToChild<U>(this object parent) {
    // note how I used "parent.GetType()" instead of `typeof(T)`
    if (!typeof(U).IsSubclassOf(parent.GetType()))
        throw new Exception(typeof(U).Name + " isn't a subclass of " + parent.GetType().Name);
    var serializedParent = JsonConvert.SerializeObject(parent);
    return JsonConvert.DeserializeObject<U>(serializedParent);
}

顺便说一句,您的方法无论如何都没有充分利用泛型类型参数T。您可以将其用作 的约束U,避免运行时检查:

public static U ParentToChild<T, U>(this T parent) where U : T {
    //                                            ^^^^^^^^^^^^^
    var serializedParent = JsonConvert.SerializeObject(parent);
    return JsonConvert.DeserializeObject<U>(serializedParent);
}

因此,如果您将object其用作参数,则会丢失此编译时类型检查。

于 2018-07-06T10:26:19.570 回答