gpt4 book ai didi

c# - 将静态类型对象扩展为动态对象

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

我正在使用 dynamic我的 View 模型的对象,因为我发现不需要使用像 Automapper 这样的东西的开销,并且发现这种方法更加灵活和轻量级。我正在使用来自 impromptu-interface 的构建器像这样:

private dynamic New = Builder.New();

private dynamic GetViewModel(Product p)
{
var viewModel = New.Product( id : p.Id, name : p.Name );
viewModel.AdditionalProperty = "some additional data";
return viewModel;
}

在某些情况下,“扩展”实际对象比一一重新映射所有属性更好,类似于您在 JavaScript 中使用 jQuery.extend() 的方式。

private dynamic GetViewModel(Product p)
{
var viewModel = //create base dynamic object, that has all the members of p.
viewModel.AdditionalProperty = "some additional data";
return viewModel;
}

这应该可以使用 ExpandoObject 来实现结合反射和遍历所有成员,但我想知道是否有更清洁/更整洁的解决方案。

最佳答案

我最终是这样实现的:

public class ExpandedObject : DynamicObject
{
private readonly IDictionary<string, object> expando = new ExpandoObject();

public ExpandedObject(object o)
{
foreach (var propertyInfo in o.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance))
{
this.expando[propertyInfo.Name] = Impromptu.InvokeGet(o, propertyInfo.Name);
}
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return this.expando.TryGetValue(binder.Name, out result);
}

public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.expando[binder.Name] = value;
return true;
}
}

和测试:

[TestFixture]
public class ExpandedObjectTest
{
[Test]
public void Can_add_new_properties_to_expanded_object()
{
dynamic expanded = new ExpandedObject(new object());
var data = "some additional data";
expanded.data = data;
Assert.AreEqual(data, expanded.data);
}

[Test]
public void Copies_existing_properties()
{
var obj = new { id = 5 };
dynamic expanded = new ExpandedObject(obj);
Assert.AreEqual(obj.id, expanded.id);
}
}

这使用 Impromptu.InvokeGet() 而不是 PropertyInfo.GetValue() 因为 Impromptu.InvokeGet() 使用 DLR 和因此,比我测试中的反射快 2.5 倍。总的来说,这工作得相当快,并且几乎不存在多达 10,000 个对象的开销。

我应该注意,这对扩展其他 ExpandoObject 或类似对象不起作用,但这实际上并不是必需的。

关于c# - 将静态类型对象扩展为动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707557/

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