C#:从反射中返回stong类型

时间:2011-08-16 16:12:22

标签: c# dynamic types casting

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

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

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

我可以很容易地将类型返回到returnVal。是否可以将\转换为更强类型的版本?

编辑清晰度:

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

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

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

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

CONTEXT

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

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

2 个答案:

答案 0 :(得分:2)

如果你不静态地知道Type,你怎么能使用静态类型的引用?你可以做的是让返回的类型实现一个你静态知道的接口,然后转换为该接口。

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

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

答案 1 :(得分:1)

不,您无法获得具体类型的优势,例如编译时检查和智能感知。这是因为您实际上只是在运行时计算出类型。它是后期绑定,这意味着它是动态和DLR的工作。您可以将它强制转换为您知道实际对象将继承的对象(例如对象),但不能转换为实际类型。如果您有例如:

,您可能希望将泛型作为替代方案
public T GetReturnVal<T>()
{
   return (T)context.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null, context, lParams.ToArray());
}

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

我建议您阅读An Introduction to C# Generics,因为它完全符合您添加的上下文所需的内容。