通用对象属性绑定
本文关键字:绑定 属性 对象 | 更新日期: 2023-09-27 18:07:41
我正在使用来自第三方的web服务。我已经在该服务周围创建了一个包装器,这样我就可以只公开我想要的方法,还可以执行输入验证等。因此,我试图实现的是一种通用方法,将我所公开的类映射到web服务中的对应类。
例如,web服务有一个AddAccount(AccountAddRequest request)
方法。在我的包装器中,我公开了一个名为CreateAccount(IMyVersionOfAccountAddRequest request)
的方法,然后我可以在实际构建web服务所期望的AccountAddRequest
之前执行任何我想做的事情。
我正在寻找一种方法来迭代所有的公共属性在我的类,确定是否有一个匹配的属性在web服务的版本,如果是这样,分配值。如果没有匹配的属性,它就会被跳过。
我知道这可以通过反思来完成,但是如果有任何文章或者我正在尝试做的事情有一个具体的名字,我将不胜感激。
Copy &粘贴时间! !
下面是我在一个项目中用于合并对象之间的数据:
public static void MergeFrom<T>(this object destination, T source)
{
Type destinationType = destination.GetType();
//in case we are dealing with DTOs or EF objects then exclude the EntityKey as we know it shouldn't be altered once it has been set
PropertyInfo[] propertyInfos = source.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => !string.Equals(x.Name, "EntityKey", StringComparison.InvariantCultureIgnoreCase)).ToArray();
foreach (var propertyInfo in propertyInfos)
{
PropertyInfo destinationPropertyInfo = destinationType.GetProperty(propertyInfo.Name, BindingFlags.Public | BindingFlags.Instance);
if (destinationPropertyInfo != null)
{
if (destinationPropertyInfo.CanWrite && propertyInfo.CanRead && (destinationPropertyInfo.PropertyType == propertyInfo.PropertyType))
{
object o = propertyInfo.GetValue(source, null);
destinationPropertyInfo.SetValue(destination, o, null);
}
}
}
}
如果您注意到我留在那里的Where
子句,它将从列表中排除特定属性。我把它留在这里,这样你就可以看到怎么做了,你可能有一个属性列表,你想排除的任何原因。
你还会注意到这是作为一个扩展方法完成的,所以我可以这样使用它:
myTargetObject.MergeFrom(someSourceObject);
我不相信这有任何真正的名称,除非你想用'克隆'或'合并'。