[英]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.