假设我有一个功能
public void func1<T>();
另一个功能:
public void func2(Type type);
在func2中,我想用类型调用func1。我怎样才能“转换”这个类型以便它适合?
编辑: 我不认为这很重要,但func1不是我的功能。它是框架的一部分:
context.CreateObjectSet<T>()
答案 0 :(得分:4)
您无法显式调用泛型函数,因为您在编译时不知道类型。您可以使用反射来调用func1
并将type
指定为通用参数。但是,我建议您更改方法的签名,以避免在可能的情况下使用反射。
以下是使用Reflections进行操作的示例:
private static void Method1(Type type)
{
MethodInfo methodInfo = typeof(Program).GetMethod("Method2", BindingFlags.NonPublic | BindingFlags.Static);
MethodInfo genericMethodInfo = methodInfo.MakeGenericMethod(type);
genericMethodInfo.Invoke(null, null);
}
private static void Method2<T>()
{
Console.WriteLine(typeof(T).FullName);
}
答案 1 :(得分:1)
你必须使用反射。
public void func2(Type type)
{
// call func1<T>()
var thisType = this.GetType();
var method = thisType.GetMethod("func1", new Type[0]).MakeGenericMethod(type);
method.Invoke(this, null);
}
答案 2 :(得分:0)
另一种选择当然是:你可以简单地走另一个方向,使Type
版本成为“真正的”版本:
public T func1<T>()
{
func2(typeof(T));
}
public object func2(Type type)
{
Console.WriteLine(type.FullName);
}
这类似于框架实现Enum.TryParse<TEnum>
和Enum.TryParseEnum
的方式。通用TEnum
变体的实现只是将其(通过typeof(TEnum)
)传递给非泛型(Type
- )方法。