我的用例可以包含数千个类的实例。该类中的一个属性也与类的属性相同,这可以继续。
所以我基本上有一组嵌套类。现在,如果我要搜索一个房产的价值,我的选择是什么。
我发现recursionion为一个(Getting Nested Object Property Value Using Reflection)并且将GetNestedTypes(https://msdn.microsoft.com/en-us/library/493t6h7t(v=vs.110).aspx)详尽地用作其他。
我读到反射是昂贵的,所以我的问题是,有没有其他方法来搜索属性而不使用反射概念?
答案 0 :(得分:1)
您可以使用表达式树来创建抽象语法树,然后可以将其编译为动态方法。这与定期编写的代码非常接近(从我的测试开始,它比反射快很多倍)。动态方法的创建是昂贵的,所以创建一次,多次使用。
static Func<object,object> CreateDelegate(PropertyInfo[] path)
{
var rootType = path.First().DeclaringType;
var param = Expression.Parameter(typeof(object));
Expression access = Expression.Convert(param, rootType);
foreach (var prop in path)
{
access = Expression.MakeMemberAccess(access, prop);
}
var lambda = Expression.Lambda<Func<object, object>>(
Expression.Convert(access, typeof(object)),
param
).Compile();
return lambda;
}
static void Main(string[] args)
{
var path = new[]
{
typeof(Root).GetProperty("Level1"),
typeof(Level1).GetProperty("Level2"),
typeof(Level2).GetProperty("Name")
};
var method = CreateDelegate(path);
var data = new Root { Level1 = new Level1 { Level2 = new Level2 { Name = "Test" } } };
var result = method(data);
}