代码之家  ›  专栏  ›  技术社区  ›  Jonathan Applebaum

为什么编译器不允许传递Class.System.Type 作为泛型方法的T参数[重复]

  •  0
  • Jonathan Applebaum  · 技术社区  · 7 年前

    编译错误:

    视觉Basic.NET 编译错误:“未定义类型t”

    编译错误:“t”是一个变量,但用作类型

    为什么我不能这样做:

    VB语言:

    For i = 0 To dt.Columns.Count - 1
        Dim t As Type = dt.Columns(i).DataType
        Dim field = dt.GetValueSafely(Of t)(dt.Columns(i).ColumnName, 0) ' compilation error'
    Next
    

    C#:

    for (int i = 0; i <= dt.Columns.Count - 1; i++)
    {
        Type t = dt.Columns[i].DataType;
        var field = dt.GetValueSafely<t>(dt.Columns[i].ColumnName, 0); // compilation error
    }
    

    是否有其他方法可以实现我要做的事情,或者我必须直接声明类型?

    2 回复  |  直到 7 年前
        1
  •  0
  •   vinicius.ras    7 年前

    当调用使用泛型的函数时,编译器希望您在小于/大于符号(“<”)之间给它一个类/结构名称和“>”)。

    您正在向它传递一个实例变量( t )相反:这是一个实际的对象实例,而不是编译器所期望的类/结构名。

    GetValueSafety<T>() MethodInfo dt ,然后指定此方法的泛型类型参数,然后调用它(传递所需的参数)。在你的情况下,这可以归结为这样的事情:

    MethodInfo method = dt.GetType().GetMethod("GetValueSafety");
    MethodInfo callableMethod = method.MakeGenericMethod(t);
    
    Object [] callParams = new Object[] { dt.Columns[i].ColumnName, 0 };
    callableMethod.Invoke(dt, callParams);
    
        2
  •  -1
  •   X39    7 年前

    因为你用错了

    t

    为此,您需要使用实际的类型来归档 Type

    由于无法在运行时确定类型的原因,有大量的文档存在,例如。 Setting generic type at runtime