c#:从反射返回强类型

本文关键字:返回 强类型 反射 | 更新日期: 2023-09-27 18:05:40

在最新版本的c#中,如果提前知道动态类型,是否可以将其转换为强类型?

我使用反射来调用对象上的方法,它返回到var:

var returnVal = context.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null, context, lParams.ToArray());

我可以很容易地得到返回给returnVal的类型。是否有可能将'convert thins转换为更强类型的版本?

编辑:

在这种情况下,我知道返回的类型,但只能通过string返回。要获取类型,我必须执行:

diAssemblies[k].GetType(diAssemblies[k].GetName().Name + "." + returnType)

其中returnType为返回类型的名称。

理想情况下,我希望能够在强类型字段中获得方法调用的结果。

<<p> 上下文/strong>

我正在从目录加载包含.edmx文件的程序集,然后在这些上下文中调用方法。在运行时,加载程序将不知道它将加载哪些程序集。但是,使用加载器的人会知道程序集、方法和类型。

这是为了通过实体框架(带有存储过程)创建一个通用的数据库调用包装器,该包装器将在其他地方重用。

c#:从反射返回强类型

如果您不知道静态类型,如何使用静态类型引用呢?可以做的是让返回类型静态地实现一个你知道的接口,然后强制转换到那个接口。

如果MyStrongType实现了IMyStrongBehavior,你可以将返回值强制转换为IMyStrongBehavior并静态地使用它。无论是否强制转换,底层值都已经是强类型的。

或者,您可以将返回值存储在dynamic变量中(这将允许您在没有实际静态类型接口的情况下调用已知方法)。这里的缺点是你不会得到任何智能感知,你所犯的任何错误直到运行时才会出现。

不,您无法获得具体类型的优点,例如编译时检查和智能感知。这是因为您实际上只在运行时计算类型是什么。它是后期绑定的,这意味着它是动态和DLR的工作。你可以将它强制转换为一个你知道实际对象将继承的对象(例如object),但你不能强制转换为实际类型。如果您有以下情况,您可能需要研究泛型作为替代方案,例如:

public T GetReturnVal<T>()
{
   return (T)context.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null, context, lParams.ToArray());
}

你至少会返回一个具体的类型给t类型的调用者,但是这个类型必须在编译时设置,也就是提前知道。

我建议你阅读《c#泛型入门》,因为从你所添加的上下文来看,它确实做了你需要做的事情。