繁体   English   中英

C#:从反射返回强类型

[英]C#: return stong types from reflection

在最新版本的C#中,如果事先知道类型,是否可以将动态类型转换为强类型?

我正在使用反射在 object 上调用一个方法,该方法返回一个 var:

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

我可以轻松地将类型返回到returnVal 是否可以将变薄转换为更强类型的版本?

编辑清晰:

在这种情况下,我知道返回的类型,但只知道字符串。 要获得类型,我必须这样做:

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

returnType是要返回的类型的名称。

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

语境

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

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

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

因此,如果 MyStrongType 实现 IMyStrongBehavior,您可以将返回值强制转换为 IMyStrongBehavior 并静态使用它。 基础值已经是强类型的,无论您是否强制转换它。

或者,您可以将返回值存储在dynamic变量中(这将允许您在没有实际静态类型接口的情况下调用已知方法。)这里的缺点是您没有得到任何 Intellisense 并且您犯的任何错误都不会显示到运行时。

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

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

您至少会向 T 类型的调用者返回一个具体类型。但是这种类型必须在编译时设置,即提前知道。

我建议您阅读C# Generics 简介,因为从您添加的上下文来看,它确实是您需要做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM