【问题标题】:passing generic list of reflected type to method in reflected type [closed]将反射类型的通用列表传递给反射类型中的方法[关闭]
【发布时间】:2016-09-15 17:37:24
【问题描述】:

我在运行时使用第三方程序集。该程序集公开了一个接受结构通用列表的方法。该结构是在第三方程序集中定义的。

<thirdpartassembly>
public struct stStruct
{
 public string member1;
 public decimal member2;
}
public class businessType
{
public string processItems(List<stStruct> processItems)
{
 //process items, then return result
}
}
</thirdpartassembly>

鉴于在运行时使用反射创建的 [businessType] 实例,我正在尝试将项目列表 [listofStructItems] 传递给 [processItems] 方法。

如何定义/创建 [listofStructItems] ?

到目前为止我尝试了什么:

  1. 传递包含 stStruct 项的列表。
  2. 在我的代码中创建与 stStruct (cstStruct) 具有相同定义的结构,然后将 List 传递给 processItems 方法。 (无法将 x 列表转换为 y 列表)。

环境:

  • 第三方程序集:.Net v.2
  • 我的程序集:高于 v.2 的任何内容

有什么想法吗?我也希望能解释一下为什么上述选项都不起作用。

【问题讨论】:

  • 为什么要使用反射?像预期的那样传递List&lt;stStruct&gt; 有什么问题?
  • 我在运行时加载此程序集,stStruct 在该程序集中定义,在设计时不存在。创建 stStruct 的镜像不起作用(无法将 stStruct 列表转换为 mirrorstStruct)。
  • 为什么不将程序集包含在您的项目中,避免因尝试做不可能的事情而头疼?
  • 此程序集无法与应用程序一起部署(许可限制)。它应该在安装后部署到应用程序位置
  • 为什么是-1?问题描述中是否缺少某些内容?

标签: c# generics dynamic reflection runtime


【解决方案1】:

到目前为止我尝试了什么:

  1. 传递包含 stStruct 项的列表。

没有代码很难说是哪里出了问题。

  1. 在我的代码中创建与 stStruct (cstStruct) 具有相同定义的结构,然后将 List 传递给 processItems 方法。 (无法将 x 列表转换为 y 列表)。

这就是类型安全语言的工作原理,它是一种不同的类型。

解决这个问题的关键是Type.MakeGenericType方法创建一个泛型类型,在编译时类型参数未知。请记住,Assembly.GetType() 方法需要包含命名空间的类型名称。您可以内联其中一些临时变量,我创建它们只是为了更清楚地了解一般反射过程。

var businessTypeInstance = ...;
var processItemsMethod = businessTypeInstance.GetType().GetMethod("processItems");
var stStructType = businessTypeInstance.GetType().Assembly.GetType("stStruct");
var openListType = typeof(List<>);
var closedListType = openListType.MakeGenericType(stStructType);
var listOfStruct = Activator.CreateInstance(closedListType);
var result = processItemsMethod.Invoke(businessTypeInstance, new [] { listOfStruct });


只是为了拓宽思路,即使我不推荐这样做,您也可以从参数本身获取 List&lt;stStruct&gt; 类型:
var closedListType = processItemsMethod.GetParameters()[0].ParameterType;

【讨论】:

  • 谢谢!很好的答案!你的解释很有道理。一切正常后,我会尝试发布完整的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2023-04-03
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多