【问题标题】:How could I pass the type using Variables to the generic method?如何将使用变量的类型传递给泛型方法?
【发布时间】:2010-03-18 18:28:44
【问题描述】:

我在 c# 中有一个通用方法:

public IList<T> getList<T>();

当我像下面这样称呼它时?

...
Type T1=metadata.ModelType;
getList<T1>();

...

编译时出错。

我该怎么做呢? 我真的需要将类型作为变量传递给泛型方法!

【问题讨论】:

    标签: c# types generics


    【解决方案1】:

    泛型参数是一个类型参数:

    getList<string>(); // Return a list of strings
    getList<int>(); // Return a list of integers
    getList<MyClass>(); // Return a list of MyClass
    

    你不是用 type 而是用一个对象来调用它。

    【讨论】:

    • Oded,我不同意,它也不是用对象来调用的。它只有在您首先解析泛型类型时才可调用。
    • @Enigmativity:你这是什么意思? “解决”是什么意思? OP is 试图将对象作为类型传递,所以你错了。
    • @Oded,在运行时间之前我不知道真实类型,所以这不是我预期的方式。
    • @"Konrad Rudolph" - 他没有将“一个对象作为类型”传递,他试图将“一个类型作为对象”传递。通常需要编译时类型解析。只有使用反射才能在运行时将类型作为对象传递。我不知道将对象作为类型传递实际上意味着什么。
    【解决方案2】:

    正如 Oded 指出的那样,您不能按照您尝试的方式执行此操作,因为 &lt;T&gt; 不接受类型。但是,您可以使用反射实现您想要的:

    Type T1=metadata.ModelType;
    
    MethodInfo method = GetType().GetMethod("getList");
    MethodInfo genericMethod = method.MakeGenericMethod(new Type[] { T1 });
    
    genericMethod.Invoke(this, null);
    

    如果getList 是一个静态方法,或者在另一个类中,您需要将GetType() 替换为typeof(...),其中... 是类的名称。

    【讨论】:

      【解决方案3】:

      您不能:在您的示例中,T1 是 System.Type 类的一个实例,而不是像 IList 这样的实际类型

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 2014-06-08
        • 1970-01-01
        相关资源
        最近更新 更多