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

标签 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);
    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 才能调用 ToTraceString()?

最佳答案

作为TyCobb说,你有更多的反射(reflection)。继续前进,直到找到可以为其编写强制转换的类型,例如 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);

    //...
 }

关于c# - 在运行时将对象转换为泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26769746/

相关文章:

c# - Diamond-Square 算法不产生 "smooth"噪声

c# - 如何在C#中配置中间输出目录

java - 对于java泛型来说<>意味着什么?

Go 函数创建泛型类型的新指针或新值

c# - 删除 DevExpress WPF 主题

c# - 如何在我的情况下使用 mvvm 绑定(bind) DataGrid(ObservableCollection 内的 ObservableCollection)

Java:按降序对 ArrayList<Object> 进行排序

java - 如何通过反射正确实例化内部类?

java - 通过java反射从Field中访问整型数组

java - 在运行时通过反射进行强制转换