Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时将对象强制转换为泛型类型_C#_Generics_Reflection - Fatal编程技术网

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#。你考虑过动态引用吗?