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

问题描述 投票:0回答:2

我正在使用反射来调用通用方法,该方法返回一个对象,我想转换该对象以在之后调用方法。

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()?

c# generics reflection
2个回答
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);

    //...
 }

0
投票

为了完整起见,添加我的 2 美分。

假设您有一个泛型类(由您控制),并且您想将一个对象转换为它,而不知道

<T>
,以便您可以调用某些方法/属性。

public class MyThing<T>
{
    //the method you want to call after casting
    public void DoStuff()
    {
        //do stuff
    }
}

通常最好的选择是使用接口,并强制转换为接口

public class MyThing<T> : IMyThing // <-- add this
{
    //the method you want to call after casting
    public void DoStuff()
    {
        //do stuff
    }
}

public interface IMyThing
{
    public void DoStuff();
}

//now you can cast unknown object to IMyThing and call `DoStuff()`
((IMyThing)unknownObject).DoStuff();
© www.soinside.com 2019 - 2024. All rights reserved.