通用对象属性绑定

本文关键字:绑定 属性 对象 | 更新日期: 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);

我不相信这有任何真正的名称,除非你想用'克隆'或'合并'。