Można użyć refleksji do niego, nawet pomijając obudowę nieruchomości (zawiadomienie 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; }
}
Jeśli nie wiesz prefiks Mgr
, można tylko mecz przyrostki:
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));
}
i bardzo wąski i niepraktyczne założeniu,: odwzorowanie b w zamówieniu właściwości (jeśli oczekujesz, że 2 typy będą miały właściwości zdefiniowane w tej samej sekwencji i numerze, jedyną różnicą będą nazwy właściwości). Nie polecam nikomu używania go w prawdziwym życiu, ale mimo to jest tutaj (wystarczy aby uczynić go bardziej kruchy :)):
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));
});
* "Nie chcę używać żadnych narzędzi firm trzecich zbyt. "* Dlaczego nie? –
Użyj refleksji http://msdn.microsoft.com/en-us/library/f7ykdhsy.aspx –
Tylko sugestia: http://automapper.org/, jest to świetne narzędzie do konwersji takich obiektów. –