Sie Reflexion dafür verwenden könnte, auch durch die Eigenschaft Gehäuse zu ignorieren (man beachte die 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; }
}
Wenn Sie das Mgr
Präfix nicht kennen, kann man nur Spiel durch Suffixe:
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));
}
und eine sehr enge und unpraktisch Annahme: Mapping b auf der Eigentumsordnung (wenn Sie erwarten, dass die 2 Typen Eigenschaften in der gleichen Reihenfolge und Anzahl haben, der einzige Unterschied sind die Eigenschaftsnamen). Ich würde niemanden empfehle es im wirklichen Leben mit, aber immer noch, hier ist es (nur um es mehr zerbrechlich zu machen :)):
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));
});
* "Ich mag nicht zu allen Tools von Drittanbietern verwenden. "* Warum nicht? –
Verwenden Sie Reflektion http://msdn.microsoft.com/en-us/library/f7ykdhsy.aspx –
Nur ein Vorschlag: http://automapper.org/, es ist ein großartiges Werkzeug, um Objekte wie diese zu konvertieren. –