我在运行时使用第三方程序集。程序集公开了一个接受结构通用列表的方法。结构在第三方程序集本身中定义。
<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]?
到目前为止我尝试了什么:
环境:
有什么想法?我也很感激为什么上述选项都没有起作用的解释。
答案 0 :(得分:1)
到目前为止我尝试了什么:
- 传递包含stStruct项目的列表。
醇>
没有代码很难说出错了。
- 在我的代码中创建一个与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<stStruct>
类型:
var closedListType = processItemsMethod.GetParameters()[0].ParameterType;