C#从泛型数组类型中获取泛型非数组类型

本文关键字:类型 泛型 数组 获取 | 更新日期: 2023-09-27 18:21:34

给定以下函数;

void SomeFunction<T>(...){
    SomeOtherFunction<T>();
}

这很好,但有时函数在T是数组类型之前失败,但它不能是数组类型。这些函数与字典的JSON反序列化有关,但由于某些原因,当字典只有一个条目时,它不接受t数组参数。

简而言之,我想做这个

void SomeFunction<T>(...){
    try {
    SomeOtherFunction<T>();
    } catch ( Exception e ){
        SomeOtherFunction<T arrayless>();
    }
}

我已经尝试了很多东西,我意识到真正的问题在其他地方,但我需要暂时解决这个问题,这样我才能在反序列化程序中找到真正的解决方案。我也试着用以下方法进行反思;

MethodInfo method = typeof(JToken).GetMethod("ToObject", System.Type.EmptyTypes);
MethodInfo generic = method.MakeGenericMethod(typeof(T).GetElementType().GetGenericTypeDefinition());
object result = generic.Invoke(valueToken, null);

但这也不太奏效。

谢谢!

C#从泛型数组类型中获取泛型非数组类型

我真的不确定你在这里想要实现什么,但要获得数组中元素的类型,你必须使用Type.GetElementType():

void SomeFunction<T>()
{
    var type = typeof(T);
    if(type.IsArray)
    {
        var elementType = type.GetElementType();
        var method = typeof(Foo).GetMethod("SomeOtherFunction")
                                .MakeGenericMethod(elementType);
        // invoke method
    }
    else
        foo.SomeOtherFunction<T>(...);
}

如果我没有记错,您需要调用两个泛型函数中的一个,这取决于对象的类型是否为数组。

怎么样:

if (typeof(T).ImplementsInterface(typeof(IEnumerable)))
    someFunction<T>();
else
    someOtherFunction<T>();