I answered a similar question here. The difference is that you want the from and to to have different types and to match properties by name and by type. This is not too hard.
I haven't tested this - but give it a shot
public static class ExtensionMethods
{
public static void CopyPropertiesTo<T, U>(this T source, U dest)
{
var plistsource = from prop1 in typeof(T).GetProperties() where prop1.CanRead select prop;
var plistdest = from prop2 in typeof(U).GetProperties() where prop2.CanWrite select prop;
foreach (PropertyInfo destprop in plistdest)
{
var sourceprops = plistsource.Where((p) => p.Name == destprop.Name &&
destprop.PropertyType.IsAssignableFrom(p.GetType()));
foreach (PropertyInfo sourceprop in sourceprops)
{ // should only be one
destprop.SetValue(dest, sourceprop.GetValue(source, null), null);
}
}
}
}
}
If you don't like the extension method, you could just rewrite this to be public static void CopyPropertiesTo(object source, object dest);
this should let you do something like this:
Foo foo = new Foo();
Bar bar = GetBar();
bar.CopyPropertiesTo<Bar, Foo>(foo);