gpt4 book ai didi

c# - 如何动态创建包含点符号的 Lambda 表达式

转载 作者:行者123 更新时间:2023-12-05 01:48:06 27 4
gpt4 key购买 nike

我今天有一个方法可以返回基于字符串属性名称的 lambda 表达式,即我传入“Description”并返回 d => d.Description 的 lambda。这很好用,但现在我需要返回一个 lambda 表达式,给定一个包含点符号的字符串,即我想传递“Customer.Name”并得到 d => d.Customer.Name 的 lambda 表达式。下面是我已经创建的返回 1 级 lambda 的方法,但我不确定如何将其更改为多级。

protected dynamic CreateOrderByExpression(string sortColumn)
{
var type = typeof (TEntity);
Type entityType = null;
if (type.IsInterface)
{
var propertyInfos = new List<PropertyInfo>();

var considered = new List<Type>();
var queue = new Queue<Type>();
considered.Add(type);
queue.Enqueue(type);
while (queue.Count > 0)
{
var subType = queue.Dequeue();
foreach (var subInterface in subType.GetInterfaces().Where(subInterface => !considered.Contains(subInterface)))
{
considered.Add(subInterface);
queue.Enqueue(subInterface);
}

var typeProperties = subType.GetProperties(
BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.Instance);

var newPropertyInfos = typeProperties
.Where(x => !propertyInfos.Contains(x));

propertyInfos.InsertRange(0, newPropertyInfos);

if (propertyInfos.All(f => f.Name != sortColumn)) continue;

entityType = subType;
break;
}
}


if (entityType == null)
{
return null;
}

var parameter = Expression.Parameter(typeof (TEntity));
var memberExpression = Expression.Property(parameter, entityType, sortColumn);
var lambdaExpression = Expression.Lambda(memberExpression, parameter);

return lambdaExpression;
}

最佳答案

像这样创建一个辅助方法(在代码的底部使用):

LambdaExpression GetLambdaExpression(Type type, IEnumerable<string> properties)
{
Type t = type;
ParameterExpression parameter = Expression.Parameter(t);
Expression expression = parameter;

for (int i = 0; i < properties.Count(); i++)
{
expression = Expression.Property(expression, t, properties.ElementAt(i));
t = expression.Type;
}

var lambdaExpression = Expression.Lambda(expression, parameter);
return lambdaExpression;
}

现在像这样使用它:

GetLambdaExpression(typeof(Outer), new[] { "InnerProperty", "MyProperty" });

对于以下类:

class Outer
{
public Inner InnerProperty { get; set; }
}

class Inner
{
public int MyProperty { get; set; }
}

我知道它可能更适合您的原始代码,但我想您可以从这里开始(比如将带点的字符串转换为数组)。我知道它可以使用递归来完成,但我今天头疼...

关于c# - 如何动态创建包含点符号的 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18895977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com