C# 在运行时将对象强制转换为泛型类型
我使用反射来调用一个泛型方法,这个方法返回一个对象,我想在这个对象上强制转换以在之后调用一个方法C# 在运行时将对象强制转换为泛型类型,c#,generics,reflection,C#,Generics,Reflection,我使用反射来调用一个泛型方法,这个方法返回一个对象,我想在这个对象上强制转换以在之后调用一个方法 public static string GetTableName(this ObjectContext context, Type T) { var method = typeof(ObjectContext).GetMethod("CreateObjectSet", new Type[]{}); var generic = method.MakeGenericMethod(T);
public static string GetTableName(this ObjectContext context, Type T)
{
var method = typeof(ObjectContext).GetMethod("CreateObjectSet", new Type[]{});
var generic = method.MakeGenericMethod(T);
var objectSet = generic.Invoke(context, null);
var sqlString = objectSet.ToTraceString();
// doesn't work because ToTraceString() isn't a method of object
// it's a method of ObjectSet<T>
...
}
公共静态字符串GetTableName(此ObjectContext上下文,类型T)
{
var method=typeof(ObjectContext).GetMethod(“CreateObjectSet”,新类型[]{});
var generic=method.MakeGenericMethod(T);
var objectSet=generic.Invoke(上下文,null);
var sqlString=objectSet.ToTraceString();
//不起作用,因为ToTraceString()不是对象的方法
//这是ObjectSet的一种方法
...
}
直到运行时才知道。如何将objectSet强制转换为objectSet以调用ToTraceString()?如前所述,您已经使用了更多的反射。继续,直到找到可以编写强制转换的类型,例如string
:
public static string GetTableName(this ObjectContext context, Type T)
{
var method = typeof(ObjectContext).GetMethod("CreateObjectSet", new Type[] { });
var generic = method.MakeGenericMethod(T);
var objectSet = generic.Invoke(context, null);
var toTrace = typeof(ObjectSet<>).MakeGenericType(T).GetMethod("ToTraceString");
var sqlString = (string)toTrace.Invoke(objectSet, null);
//...
}
公共静态字符串GetTableName(此ObjectContext上下文,类型T)
{
var method=typeof(ObjectContext).GetMethod(“CreateObjectSet”,新类型[]{});
var generic=method.MakeGenericMethod(T);
var objectSet=generic.Invoke(上下文,null);
var toTrace=typeof(ObjectSet).MakeGenericType(T).GetMethod(“ToTraceString”);
var sqlString=(string)toTrace.Invoke(objectSet,null);
//...
}
您必须使用更多的反射来调用objectSet
上的任何内容。请记住,您可以以这样一种方式构造程序,即不需要强制转换或反射。寻找函数式编程和F#。你考虑过动态引用吗?