如何使用变量将类型传递给通用方法?

3

我有一个C#中的通用方法:

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

当我按照以下方式进行调用时?
...
Type T1=metadata.ModelType;
getList<T1>();

编译时出现错误。

我该怎么办呢? 我真的需要将类型作为变量传递给这个通用方法!

3个回答

3
通用参数是一个类型参数:
getList<string>(); // Return a list of strings
getList<int>(); // Return a list of integers
getList<MyClass>(); // Return a list of MyClass

你没有使用类型,而是使用了一个对象。


Oded,我不同意,它也不叫做带有对象的调用。只有在解析泛型类型之后才能调用。 - Enigmativity
@Enigmativity:你的意思是什么?你所说的“解析”是什么意思?OP确实试图将一个对象作为类型传递,所以你是错的。 - Konrad Rudolph
@Oded,我在运行时不知道真正的类型,所以这不是我预期的方式。 - Sam Zhou
"Konrad Rudolph" - 他不是在传递 "一个对象作为类型",而是试图传递 "一个类型作为对象"。通常需要使用编译时类型解析。只有使用反射才能在运行时将类型作为对象传递。我不知道传递一个对象作为类型实际上意味着什么。 - Enigmativity

2
正如Oded所指出的那样,你不能按照你尝试的方式来做,因为<T>不接受类型。但是,你可以使用反射来实现你想要的效果:
Type T1=metadata.ModelType;

MethodInfo method = GetType().GetMethod("getList");
MethodInfo genericMethod = method.MakeGenericMethod(new Type[] { T1 });

genericMethod.Invoke(this, null);

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

0

在您的示例中,T1是System.Type类的实例,而不是像IList一样的实际类型,因此无法使用“:”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接