在我们的报告环境中,我们有一个获取DataSources的方法,如下所示:
protected override IEnumerable<ReportDataSource> GetDataSources(IEnumerable<ReportParameter> parameters)
{
return new List<ReportDataSource>
{
new ReportDataSource("DataSource1", GetDataSource1(parameters)),
new ReportDataSource("DataSource2", GetDataSource2(parameters))
};
}
所调用方法的值只是ICollections。我的问题是,我需要知道这些集合的内部类型以用于文档目的,最好不必调用该方法。我只需要他们正在进行的调用,我通过以下方式将其分解为局部变量:
const string dataSourcesMethodName = "GetDataSources";
MethodInfo methodInfo = type.GetMethod(
dataSourcesMethodName,
BindingFlags.Instance | BindingFlags.NonPublic,
Type.DefaultBinder,
new[] { typeof(IEnumerable<ReportParameter>) },
null);
var methodBody = methodInfo.GetMethodBody();
var variable = methodBody.LocalVariables.First(f => f.LocalType == typeof(IEnumerable<ReportDataSource>));
甚至可以在不调用此方法的情况下获取所需信息吗?
答案 0 :(得分:1)
简而言之,您无法执行该方法......一些示例(请参阅http://goo.gl/8QN19K):
C#:
public ICollection M1() {
ICollection col = new List<string>();
return col;
}
public ICollection M2() {
ArrayList col = new ArrayList();
col.Add("Hello");
return col;
}
IL代码本地人:
.locals init (
[0] class [mscorlib]System.Collections.ICollection,
[1] class [mscorlib]System.Collections.ICollection
)
和
.locals init (
[0] class [mscorlib]System.Collections.ArrayList,
[1] class [mscorlib]System.Collections.ICollection
)
在发布模式下进行编译更糟糕的是,本地人可能会完全消失...例如参见http://goo.gl/yvWZHR
通常,这些方法可以使用例如ArrayList
,因此是非类型化集合(如M2
方法中所示)。祝你好运,找不到元素的类型而不执行方法并解析一些元素。