我正在使用来自第三方的网络服务。我已经创建了一个围绕该服务的包装器,这样我就可以只公开我想要的方法,也可以执行输入验证等等。所以我想要完成的是一种通用的方法来映射我暴露的类来自Web服务的对应类。
例如,Web服务具有AddAccount(AccountAddRequest request)
方法。在我的包装器中,我公开了一个名为CreateAccount(IMyVersionOfAccountAddRequest request)
的方法,然后在实际构建Web服务所期望的AccountAddRequest
之前,我可以执行任何我想要做的事情。
我正在寻找一种方法来迭代我的类中的所有公共属性,确定Web服务版本中是否存在匹配属性,如果是,则分配值。如果没有匹配的属性,那么它就会被跳过。
我知道这可以通过反思来完成,但任何文章或者如果我想要做的具体名称,我们将不胜感激。
答案 0 :(得分:1)
复制&粘贴时间!!
这是我在项目中使用的一个合并对象之间的数据:
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);
除非你想使用'克隆'或'合并',否则我认为没有真正的名字。