【问题标题】:C#: return stong types from reflectionC#:从反射返回强类型
【发布时间】:2011-10-28 05:21:18
【问题描述】:

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

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

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

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

为清晰而编辑:

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

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

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

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

上下文

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

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

【问题讨论】:

  • 实际上是否使用dynamicvardynamic 完全不同,不清楚你的意思。
  • 如果你在执行时只知道它是一个字符串,你怎么可能期望它在编译时是强类型的?
  • 我不知道它在这里会有什么不同。我现在正在使用var,但如果可以完成工作,没有什么能阻止我使用dynamic
  • 嗯,你想用返回值做什么还不清楚。如果你只知道执行时的类型,你能用这个值做什么?请给我们更多的背景信息。
  • 这正是我想检查它是否可能的原因!我的直觉是它不是,但是这些地方的人对语言非常好

标签: c# dynamic types casting


【解决方案1】:

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

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

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

我建议您阅读 An Introduction to C# Generics,因为它确实可以根据您添加的上下文执行您需要执行的操作。

【讨论】:

  • 确认!对不起,这对我来说真的很糟糕。我没有正确解释。让我更新我的帖子。
  • 您还可以检查 typeof(T) 是否与您在方法中期望的类型相匹配,并根据需要抛出异常或处理。
  • 另外,如果您知道该类型会隐含某些接口,或者继承自某个基类(例如EntityObject),您可以在方法标题中的参数后面放置where T:EntityObject限制可以使用的类型。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多