我认为这很容易,但我不知道如何:)
class base1
{
public int x = 1;
//... many other fields
}
class inherit1:base1
{
int y = 5;
...
}
base bs=new base1();
// set many fields value of the bs class
bs.value1=5;
bs.value15="sss";
//....set other fileds values
inherit1 i1=new inherit1();
设置所有字段值的最快方法是将继承的类i1等于基本字段值bs?
我想做这样的事情:
i1=bs;
并在init之后所有其他字段i1。
感谢!
答案 0 :(得分:3)
您不能只将基类intance分配给派生类型。你需要转换它。
因此,您的第一个选择是使用AutoMapper
。它可以帮助您将数据从对象类型复制到其他对象。它会自动映射具有相同名称的属性。最后,您将使用此类代码f.e:
var derived = Mapper.Map<Base, Derived>(b);
第二种选择是编写方法并使用反射。
并在构造函数中使用它:
public class Derived : Base
{
public Derived(Base b)
{
SetProperties(b);
}
private void SetProperties(object mainClassInstance)
{
var bindingFlags = BindingFlags.Public | BindingFlags.Instance;
var mainClassType = mainClassInstance.GetType();
MemberInfo[] members = mainClassType.GetFields(bindingFlags).Cast<MemberInfo>()
.Concat(mainClassType.GetProperties(bindingFlags)).ToArray();
foreach (var memberInfo in members)
{
if (memberInfo.MemberType == MemberTypes.Property)
{
var propertyInfo = memberInfo as PropertyInfo;
object value = propertyInfo.GetValue(mainClassInstance, null);
if (null != value)
propertyInfo.SetValue(this, value, null);
}
else
{
var fieldInfo = memberInfo as FieldInfo;
object value = fieldInfo.GetValue(mainClassInstance);
if (null != value)
fieldInfo.SetValue(this, value);
}
}
}
}
然后你需要:
Base b = new Base {...};
Derived d = new Derived(b);
<强> 此外: 强>
实际上,将SetProperties
方法作为扩展方法会更好。
public static class ObjectExtensions
{
public static void SetProperties(this object newClassIntance, object mainClassInstance)
{
var bindingFlags = BindingFlags.Public | BindingFlags.Instance;
var mainClassType = mainClassInstance.GetType();
MemberInfo[] members = mainClassType.GetFields(bindingFlags).Cast<MemberInfo>()
.Concat(mainClassType.GetProperties(bindingFlags)).ToArray();
foreach (var memberInfo in members)
{
if (memberInfo.MemberType == MemberTypes.Property)
{
var propertyInfo = memberInfo as PropertyInfo;
object value = propertyInfo.GetValue(mainClassInstance, null);
if (null != value)
propertyInfo.SetValue(newClassIntance, value, null);
}
else
{
var fieldInfo = memberInfo as FieldInfo;
object value = fieldInfo.GetValue(mainClassInstance);
if (null != value)
fieldInfo.SetValue(newClassIntance, value);
}
}
}
}
然后,您可以将此方法用作:this.SetInheritedProperties(b);
答案 1 :(得分:0)
您想要将值从bs
复制到i1
吗?您不需要执行此操作,因为inherit1
的构造函数会自动从base1
调用该值,因此会为您初始化相同的值。
考虑一下:
class base1
{
public int x = 1;
public int y = 1;
}
class inherit1:base1
{
int z = 5;
...
}
base bs=new base1();
// bs now has x = y = 1
inherit1 i1=new inherit1();
// inherit1 also has x = y = 1, and z = 5
您现在可以致电i1.x
,这将返回1
。
但是,如果您已经拥有base
的实例,并希望将其转换为inherit1
的实例,则必须提供一些复制逻辑,例如:
class inherti1 : base1 {
public inherit1(base1 b) {
this.x = b.x;
this.y = b.y;
this.z = 6;
}
}
答案 2 :(得分:0)
在C#中,为i1=bs;
之类的引用分配引用实际上使引用i1引用了base1对象,这意味着inheret1将不再被引用并准备好进行垃圾回收。
另一个问题是i1=bs;
会导致语法错误,因为您无法将对基类的引用分配给对派生类的引用,只允许相反的情况。
我猜你所追求的是克隆。
让base1实现IClonable
接口,并在base1和inheret1类中实现clone方法。
现在不使用i1=bs;
复制对象,而是使用b2 =(base1)b1.Clone();将base1对象复制到另一个对象。
为了能够将base1对象复制到inheret1对象,您需要创建一个inheret1的构造函数,该构造函数接受一个base1对象并复制所有成员(或者更好的是从base1到inheret1的显式或隐式转换器)。 / p>