c# - 如何映射两个不同对象的属性?

标签 c# oop object

我想知道如何映射两个不同对象的字段并为其分配值。

示例:

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; }
}

现在我有了一个列表对象。我想将值分配给“经理”类。任何自动的方式来做到这一点。我可以明确地做到这一点并为其赋值。但是我的对象非常大,这就是问题所在。我也不想使用任何第三方工具。

注意:不能有manager前缀。它可以是任何东西。 (例如:mgrId 可以类似于 mgrCode)

最佳答案

您可以为它使用反射,甚至忽略属性大小写(注意 employee.IDmanager.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; }
}

如果不知道Mgr前缀,只能通过后缀匹配:

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));
}

并且一个非常狭窄且不切实际的假设:基于属性顺序的映射(如果您希望这两种类型具有以相同顺序和编号定义的属性,唯一的区别是属性名称).我不建议任何人在现实生活中使用它,但它仍然在这里(只是为了让它更脆弱 :)):

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));
        });

关于c# - 如何映射两个不同对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17675408/

相关文章:

c# - 将子类转换为其通用祖 parent 类

c# - 如何放大在矩形中绘制的影线样式?

ruby - ruby 中的过程和数据抽象

javascript - 在数组中查找唯一对象

object - Perl 6 - 是否可以创 build 置元属性的属性特征?

javascript - jQuery 中的 foreach 对象/数组

c# - 是否有任何已知的 .CompareTo(object value) 方法实际返回小于 -1 或大于 1 的值?

c# - DateTimePicker 在 Windows 窗体应用程序 C# 中单击时更改值

Java 抽象/扩展问题

oop - 练习OOP设计技能的网站