我需要将Person类实体中的实体属性Address与FactoryEntities类中的表达式linq关联起来,使用模式工厂的想法,看,这是我拥有的,我想做的:
Address address = new Address();
address.Country = "Chile";
address.City = "Santiago";
address.ZipCode = "43532";
//Factory instance creation object
//This is idea
Person person = new FactoryEntity<Person>().AssociateWithEntity(p=>p.Address, address);
public class Person: Entity
{
public string Name{ get; set; }
public string LastName{ get; set; }
public Address Address{ get; set; }
}
public class Address: Entity
{
public string Country{ get; set; }
public string City{ get; set; }
public string ZipCode{ get; set; }
}
public class FactoryEntity<TEntity> where TEntity : Entity
{
public void AssociateWithEntity<TProperty>(Expression<Func<TEntity, TProperty>> entityExpression, TProperty newValueEntity) where TProperty : Entity
{
if (instanceEntity == null || instanceEntity.IsTransient())
throw new ArgumentNullException();
/*TODO: Logic the association and validation
How set the newValueEntity into the property of entityExpression (x=>x.Direccion = direccion*/
}
}
字符串
8条答案
按热度按时间uqjltbpv1#
这个可以用:
下面的helper方法将getter表达式转换为setter委托。如果你想返回一个
Expression<Action<T,TProperty>>
而不是Action<T,TProperty>
,只要在最后不调用Compile()
方法就行了。字符串
vktxenjb2#
你可以像这样设置属性:
字符串
这只对属性有效,而对字段无效,尽管添加对字段的支持应该很容易。
但是你用来获取person的代码将无法工作。如果你想保持
AssociateWithEntity()
的返回类型void
,你可以这样做:型
另一个选择是流畅的界面:
型
iaqfqrcu3#
另一种解决方案是获取属性所有者并使用反射调用属性设置器。这种解决方案的优点是它不使用扩展方法,并且可以用任何类型调用。
字符串
0vvn1miw4#
这就是我的想法,我用这段代码为我工作,考虑到svick的贡献:
字符串
在这里,我调用工厂来构建Person对象,
型
但我不知道这段代码是否是最优的,至少我没有调用compile()方法,这说明了什么?
谢谢
kknvjkwl5#
我做了混合Rytis I解决方案和https://stackoverflow.com/a/12423256/254109
字符串
并称之为
型
qni6mghb6#
一切都简单得多:
字符串
yfjy0ee77#
使用ExpressionVisitor,它将遍历树中的嵌套项:
字符串
gywdnpxw8#
字符串
你可以做的另一件事是封装它们:
型
现在你可以像委托一样传递这些属性,并编写其逻辑可以随属性而变化的代码,这样就避免了不能通过引用传递属性的事实。