You can use reflection for it, even ignoring the property wrapper (note employee.ID vs. manager.MgrId ):
class Program { static void Main(string[] args) { var employee = new Employee() { ID = 1, Name = "John" }; var manager = new Manager(); foreach (PropertyInfo propertyInfo in typeof(Employee).GetProperties()) { typeof(Manager) .GetProperty("Mgr" + propertyInfo.Name, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public) .SetValue(manager, propertyInfo.GetValue(employee)); } } } public class Employee { public int ID { get; set; } public string Name { get; set; } } public class Manager { public int MgrId { get; set; } public string MgrName { get; set; } }
If you do not know the Mgr prefix, you can use only suffixes:
foreach (PropertyInfo propertyInfo in typeof(Employee).GetProperties()) { typeof(Manager).GetMembers() .OfType<PropertyInfo>() .FirstOrDefault(p => p.Name.EndsWith(propertyInfo.Name, StringComparison.CurrentCultureIgnoreCase)) .SetValue(manager, propertyInfo.GetValue(employee)); }
And a very narrow and impractical assumption : matching based on the order of the properties (if you expect 2 types to have properties defined in the same sequence and number, the only difference is in the names of the properties). I would not recommend that anyone use it in real life, but still here it is (just make it more fragile :)):
typeof(Employee) .GetProperties() .Select((p, index) => new { Index = index, PropertyInfo = p }) .ToList() .ForEach(p => { typeof(Manager) .GetProperties() .Skip(p.Index) .FirstOrDefault() .SetValue(manager, p.PropertyInfo.GetValue(employee)); });
Alex Filipovici Jul 16 '13 at 11:45 2013-07-16 11:45
source share