可以说我有一个功能CONVER Type类为一般的参数
public void func1<T>();
而另一功能:
public void func2(Type type);
里面FUNC2,我想打电话给FUNC1与类型。我怎样才能“转换”这种类型以适应?
编辑: 我没想到会有问题,但func1不是我的功能。它是框架的一部分:
context.CreateObjectSet<T>()
可以说我有一个功能CONVER Type类为一般的参数
public void func1<T>();
而另一功能:
public void func2(Type type);
里面FUNC2,我想打电话给FUNC1与类型。我怎样才能“转换”这种类型以适应?
编辑: 我没想到会有问题,但func1不是我的功能。它是框架的一部分:
context.CreateObjectSet<T>()
由于在编译时不知道类型,所以不能显式调用泛型函数。您可以使用反射来呼叫func1
并指定您的type
作为一般参数。不过,如果可能的话,我建议您更改方法的签名以避免使用反射。
下面是如何与思考做一个例子:
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);
}
你将不得不使用反射。
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);
}
另一种选择,当然:你可以简单地去另一个方向,使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
)的方法。
我编辑了我的问题,你能修改你的解决方案吗? – 2011-04-06 07:34:18
你可以让你的func2通用?如果没有,那么你就不能在没有反射的情况下调用func1 - 你不知道在编译时作为泛型参数传递给func1的类型,泛型是在编译时知道类型的。 – 2011-04-06 14:55:14