如何从基本接口将类复制到另一个类?

时间:2017-03-14 03:34:39

标签: c#

这是基本界面:

public interface Group
{
  string GroupName { get; set; }
}

这是第一堂课

public class GroupOne:Group
{
  string _GroupName;
            public string GroupName
            {
                set { _GroupName = value; }
                get { return _GroupName; }
            }
}

这是第二类

public class GroupTwo:Group,INotifyPropertyChanged
    {
      public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChange(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
string _GroupName;
            public string GroupName
            {
                get
                {
                    return _GroupName;
                }
                set
                {
                    _GroupName = value;
                    NotifyPropertyChange("GroupName");
                }
            }
    }

最后:

GroupOne G1=new GroupOne();
G1.GroupName="123";
GroupTwo G2;

这些是示例,实际上界面有超过80个属性,但不仅仅是' GroupName' one。如何在界面' Group'上复制所有属性。来自' G1'到' G2'?

2 个答案:

答案 0 :(得分:1)

如果您打开使用Reflection,以下代码可能会帮助您完成副本:

static void ReflectionMerge<T>(T source, T target)
    where T: class
{
    var properties = typeof(T).
        GetProperties().
        Where(x => x.CanRead && x.CanWrite);

    foreach(var property in properties)
    {
        var sourceValue = property.GetValue(source);
        property.SetValue(target, sourceValue);
    }
}

你可以像这样使用它:

GroupOne G1 = new GroupOne();
G1.GroupName = "123";
GroupTwo G2 = new GroupTwo();

ReflectionMerge<Group>(G1, G2);

值得注意的是,反射并不是完成合并/克隆的最有效方式。

您可以随时寻求以下解决方案:

public static void MergeWith(this Group target, Group source)
{
    target.GroupName = source.GroupName;
    // target.Foo = source.Foo;
    // target.Bar = source.Bar;
}

答案 1 :(得分:0)

您可以使用AutoMapper进行类型映射。虽然@StfBln答案肯定是一种有效的方法,但AutoMapper实际上简化了这种手动转换。当转换多个对象对时,这可以特别方便。 当然,您必须先进行一些设置(请参阅How do I use AutoMapper?开始),但您可以轻松地重新进行扩展(也可以在其他项目中)。

因此,对于您的用例,映射可能如下所示:

Mapper.Map<GroupTwo>(g1);

设置映射可能如下所示:

Mapper.Initialize(cfg => cfg.CreateMap<GroupOne, GroupTwo>());

或者如果您想将其放入单独的配置文件中以便于扩展...

public class MyAutoMapperProfile : Profile
{
    CreateMap<GroupOne, GroupTwo>();
}

...然后您的注册将如下所示:

Mapper.Initialize(config => config.AddProfile<MyAutoMapperProfile>());