gpt4 book ai didi

c# - 表达式树使用类的属性值创建字典

转载 作者:行者123 更新时间:2023-11-30 15:58:30 25 4
gpt4 key购买 nike

本质上,我正在尝试使用表达式树来做到这一点

var properties = new Dictionary<string, object>();

foreach (var propInfo in objType.GetTypeInfo().GetProperties(BindingFlags.Public))
{
var name = propInfo.Name;
var value = propInfo.GetValue(objInstance);

properties.Add(name, value);
}

return properties;

即创建名称和值对的字典,其中名称是 objType 的属性名称,值是 objType< 的实例 objInstance 的属性值

现在将其转换为表达式应该编译成一个简单的委托(delegate)

Func<T, Dictionary<string, object>> func = i =>
{
var properties = new Dictionary<string, object>();

properties.Add("Prop1", (object)i.Prop1);
properties.Add("Prop2", (object)i.Prop2);
properties.Add("Prop3", (object)i.Prop3);
// depending upon the number of properties of T, Add will continue

return properties;
};

我知道如何执行其中的一些操作,但我不确定如何创建字典的本地实例,然后在后续表达式中使用它(并返回它)?

最佳答案

它应该是这样的(内联评论):

public static Func<T, Dictionary<string, object>> GetValuesFunc<T>()
{
Type objType = typeof(T);

var dict = Expression.Variable(typeof(Dictionary<string, object>));
var par = Expression.Parameter(typeof(T), "obj");

var add = typeof(Dictionary<string, object>).GetMethod("Add", BindingFlags.Public | BindingFlags.Instance, null, new[] { typeof(string), typeof(object) }, null);

var body = new List<Expression>();
body.Add(Expression.Assign(dict, Expression.New(typeof(Dictionary<string, object>))));

var properties = objType.GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.Instance);

for (int i = 0; i < properties.Length; i++)
{
// Skip write only or indexers
if (!properties[i].CanRead || properties[i].GetIndexParameters().Length != 0)
{
continue;
}

var key = Expression.Constant(properties[i].Name);
var value = Expression.Property(par, properties[i]);
// Boxing must be done manually... For reference type it isn't a problem casting to object
var valueAsObject = Expression.Convert(value, typeof(object));
body.Add(Expression.Call(dict, add, key, valueAsObject));
}

// Return value
body.Add(dict);

var block = Expression.Block(new[] { dict }, body);

var lambda = Expression.Lambda<Func<T, Dictionary<string, object>>>(block, par);
return lambda.Compile();
}

像这样使用它:

public class Test
{
public int A { get; set; }
public string B { get; set; }
}

Func<Test, Dictionary<string, object>> fn = GetValuesFunc<Test>();

var obj = new Test
{
A = 5,
B = "Foo"
};

var res = fn(obj);

关于c# - 表达式树使用类的属性值创建字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43277722/

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