假设您有一个类似以下的类:
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上进行查询,因此我的理论是,此操作将总是更加耗时,从而使使用反射的性能损失变得毫无意义。我将尝试对此进行测试,但是该设置将花费我一些时间,因此我想向在此领域比我有更多经验的人提供一些初步信息