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文件的程序集,然后在这些上下文中调用方法。在运行时,加载程序将不知道它将加载哪些程序集。但是,使用加载器的人会知道程序集、方法和类型。
这是为了通过实体框架(带有存储过程)创建一个通用的数据库调用包装器,该包装器将在其他地方重用。
如果您不知道静态类型,如何使用静态类型引用呢?可以做的是让返回类型静态地实现一个你知道的接口,然后强制转换到那个接口。
如果MyStrongType实现了IMyStrongBehavior,你可以将返回值强制转换为IMyStrongBehavior并静态地使用它。无论是否强制转换,底层值都已经是强类型的。
或者,您可以将返回值存储在dynamic
变量中(这将允许您在没有实际静态类型接口的情况下调用已知方法)。这里的缺点是你不会得到任何智能感知,你所犯的任何错误直到运行时才会出现。
不,您无法获得具体类型的优点,例如编译时检查和智能感知。这是因为您实际上只在运行时计算类型是什么。它是后期绑定的,这意味着它是动态和DLR的工作。你可以将它强制转换为一个你知道实际对象将继承的对象(例如object),但你不能强制转换为实际类型。如果您有以下情况,您可能需要研究泛型作为替代方案,例如:
public T GetReturnVal<T>()
{
return (T)context.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null, context, lParams.ToArray());
}
你至少会返回一个具体的类型给t类型的调用者,但是这个类型必须在编译时设置,也就是提前知道。
我建议你阅读《c#泛型入门》,因为从你所添加的上下文来看,它确实做了你需要做的事情。