直接访问属性与通过反射访问属性的影响有多大?

时间:2019-11-29 08:55:52

标签: c# performance reflection

假设您有一个类似以下的类:

public class Test
{
    public string prop {get;set;}
    public string prop2 {get;set;}
    public string prop3 {get;set;}
    public string prop4 {get;set;}
    public string prop5 {get;set;}
    public string prop6 {get;set;}
    public string prop7 {get;set;}
    public string prop8 {get;set;}
    public string prop9 {get;set;}
    public string prop10 {get;set;}
    public string prop11 {get;set;}
    public string prop12 {get;set;}
    public int count{get;set;}
}

我正在编写一个方法,该方法在某些时候只需要从此类中取出2-4个属性,然后执行一些操作(无论选择哪个属性,它始终是相同的)。为了避免多次重复复制/粘贴相同的确切代码(例如,对于每种开关情况,都重复// do stuff部分),我编写了如下代码:

    public static DataTable GetTop(currenctCondition)
    {
        DataTable res = null;
        List<Test> appo = GetAllTests();
        string[] propToGet = null;
        switch (currenctCondition)
        {
            case condition1:
                propToGet = new string[] { "prop1", "prop2" };
                break;
            case condition2:
                propToGet = new string[] { "prop3", "prop4" };
                break;
            case condition3:
                propToGet = new string[] { "prop5", "prop6" };
                break;
            case condition4:
                propToGet = new string[] { "prop7", "prop8", "prop9", "prop10" };
                break;
        }
        foreach(Test c in appo)
        {
            foreach(string prop in propToGet)
            {
                string ent = c.GetType().GetProperty(prop).GetGetMethod().Invoke(c, null).ToString();
                // do stuff
            }

        }
        return res;
    }

基本上,为了使代码更具可读性和易于维护性,我构建了一个字符串数组,其中包含我必须访问的属性的名称,并使用反射来使用以下方法获取属性值:

string ent = c.GetType().GetProperty(prop).GetGetMethod().Invoke(c, null).ToString();

当然,这比直接访问我需要的属性要慢,但是我想知道这种选择的影响有多大。考虑到List<Test> appo可以非常小,但也可以非常大,范围从0到(可能在极少数情况下)数百万个元素。

要获取appo,我需要在MySQL上进行查询,因此我的理论是,此操作将总是更加耗时,从而使使用反射的性能损失变得毫无意义。我将尝试对此进行测试,但是该设置将花费我一些时间,因此我想向在此领域比我有更多经验的人提供一些初步信息

0 个答案:

没有答案