这是基本界面:
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'?
答案 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>());