Bạn có thể sử dụng phản ánh cho nó, thậm chí bằng cách bỏ qua vỏ bất động sản (chú ý 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; }
}
Nếu bạn không biết tiền tố Mgr
, bạn chỉ có thể phù hợp bởi hậu tố:
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));
}
và một giả định rất hẹp và không thực tế: lập bản đồ b ased trên thứ tự tài sản (nếu bạn đang mong đợi 2 loại có thuộc tính được định nghĩa trong cùng một chuỗi và số, sự khác biệt duy nhất là tên thuộc tính). Tôi sẽ không khuyên bất cứ ai sử dụng nó trong cuộc sống thực, nhưng vẫn còn, ở đây nó là (chỉ để làm cho nó thêm mong manh :)):
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));
});
Nguồn
2013-07-16 11:45:31
* "Tôi không muốn sử dụng bất kỳ công cụ của bên thứ ba quá. "* Tại sao không? –
Sử dụng sự phản chiếu http://msdn.microsoft.com/en-us/library/f7ykdhsy.aspx –
Chỉ cần một gợi ý: http://automapper.org/, một công cụ tuyệt vời của nó để chuyển đổi các đối tượng như thế này. –