通用对象属性绑定

时间:2011-09-07 00:36:19

标签: c# .net

我正在使用来自第三方的网络服务。我已经创建了一个围绕该服务的包装器,这样我就可以只公开我想要的方法,也可以执行输入验证等等。所以我想要完成的是一种通用的方法来映射我暴露的类来自Web服务的对应类。

例如,Web服务具有AddAccount(AccountAddRequest request)方法。在我的包装器中,我公开了一个名为CreateAccount(IMyVersionOfAccountAddRequest request)的方法,然后在实际构建Web服务所期望的AccountAddRequest之前,我可以执行任何我想要做的事情。

我正在寻找一种方法来迭代我的类中的所有公共属性,确定Web服务版本中是否存在匹配属性,如果是,则分配值。如果没有匹配的属性,那么它就会被跳过。

我知道这可以通过反思来完成,但任何文章或者如果我想要做的具体名称,我们将不胜感激。

1 个答案:

答案 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);

除非你想使用'克隆'或'合并',否则我认为没有真正的名字。