Reflection获取内部变量的结果值

本文关键字:结果 变量 获取 内部 Reflection | 更新日期: 2023-09-27 17:59:13

在我们的报告环境中,我们有一种获取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>));

是否可以在不调用此方法的情况下获得所需的信息?

Reflection获取内部变量的结果值

简单地说,你不能不执行这个方法。。。一些示例(请参见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方法)。祝你在不执行该方法和解析某些元素的情况下找到其元素的类型。