将反射类型的通用列表传递给反射类型中的方法

时间:2016-05-19 02:39:24

标签: c# generics dynamic reflection runtime

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

<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列表。)
  3. 环境:

    • 第三方集会:.Net v.2
    • 我的集会:v.2以上的任何事情

    有什么想法?我也很感激为什么上述选项都没有起作用的解释。

1 个答案:

答案 0 :(得分:1)

  

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

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

没有代码很难说出错了。

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

那就是类型安全语言是如何工作的,它是一种不同的类型。

解决此问题的关键是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<stStruct>类型:

var closedListType = processItemsMethod.GetParameters()[0].ParameterType;