使用反射访问数组,字典或列表中的元素

时间:2018-07-10 13:45:06

标签: c# .net reflection

我为我的团队创建了一个工具,该工具使他们可以使用LinqPad的Dump()方法直观地查看对象。这纯粹是供开发团队用来使事情变得更容易,而不是必须附加并非总是可能的调试器。

他们输入要转储的对象的名称,程序在当前上下文中执行该操作。

例如用户输入Sales.CurrentUser,应用程序使用LinqPad的Dump()方法可视化CurrentUser对象。

public void VisualiseObject()
{
    object CurrentObject = this;

    string Result = GetObjectFromUser("Enter Propery or Field path eg. Sales.CurrentUser", "");

    if (Result == null)
        return;
    else if (Result != string.Empty)
    {    
        string[] Objects = Result.Split(".".ToCharArray());

        try
        {
            foreach (string objName in Objects)
            {
                CurrentObject = GetPropValue(CurrentObject, objName);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        if (CurrentObject == null)
        {
            MessageBox.Show("Object is null");
            return;
        }
    }

    CurrentObject.Dump(Result);
}

public static object GetPropValue(object src, string propName)
{
    object result = null;

    try
    {
        result = src.GetType().GetProperty(propName).GetValue(src, null);
    }
    catch
    {
        try
        {
            result = src.GetType().GetField(propName).GetValue(src);
        }
        catch (Exception)
        {
            result = null;
        }
    }

    return result;
}   

无论如何,我试图想出一种方法来支持用户为数组,列表或字典对象提供索引或键,并以反射的方式进行处理。

用户可以提供例如。数组或列表Sales.AllUsers[0]或字典Sales.Items["Water"]

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用VisualElements,它使您可以解析表达式(请小心代码注入)。

或者您可以尝试访问数组的Get方法: (假设prop是int []类型的变量)

var getter = array.GetType().GetMethod("Get");
var value = getter.Invoke(array, new object[] { index });

尚未使用Dictionary或Collection进行测试,但也应以相同的方式工作。