在运行时将对象转换为泛型类型

3
我在使用反射调用一个泛型方法,该方法会返回一个对象,我想将其转换后再调用另一个方法。
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>
    ...
}

T在运行时才能确定。我该如何将objectSet转换为ObjectSet<T>,以便调用ToTraceString()?


你需要使用更多的反射才能在objectSet上调用任何东西。 - TyCobb
1
请记住,您可以以这样的方式构建程序,以便您永远不需要使用强制转换或反射。寻找函数式编程和F#。 - Trident D'Gao
你考虑过动态引用吗? - recursive
1个回答

5

正如 TyCobb 所说,您需要使用更多的反射。继续进行,直到您找到可以编写强制转换的类型,例如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);

    //...
 }

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