假设我们有两个班级:
public class A
{
public int P1 {set; get;}
public int P2 {set; get;}
}
public class B
{
public int P1 {set; get;}
public int P2 {set; get;}
public int P3 {set; get;}
public int P4 {set; get;}
}
我可以用某种方式转换它来初始化它们具有相同名称的成员吗?
我的意思是,如果.NET有一些东西可以排除以下操作:
A.P1 = B.P1
A.P2 = B.P2
B.P1 = A.P1
B.P2 = A.P2
并忽略其他成员......
有可能吗?
答案 0 :(得分:12)
您可以将常用属性提取到接口。
public interface IMyInterface
{
int P1 {set; get;}
int P2 {set; get;}
}
public class A : IMyInterface
{
public int P1 {set; get;}
public int P2 {set; get;}
}
public class B : IMyInterface
{
public B(IMyInterface i)
{
P1 = i.P1;
P2 = i.P2;
}
public int P1 {set; get;}
public int P2 {set; get;}
public int P3 {set; get;}
public int P4 {set; get;}
}
然后你可以这样做:
A a = new A();
a.P1 = 1;
a.P2 = 2;
B b = new B(a);
Console.WriteLine(b.P1); //Outputs 1
Console.WriteLine(b.P2); //Outputs 2
编辑: 也许您可以查看https://github.com/AutoMapper/AutoMapper库
答案 1 :(得分:5)
如果您拥有并且可以更改A类和B类,则使用接口或继承都是有效的解决方案。
如果不这样做,可以使用Reflection将属性从对象复制到另一个对象。像上面的东西
A a = new A();
B b = new B();
GenericConverter<A,B>.Convert(a, b);
public static class GenericConverter<TInput, TOutput> where TOutput : new()
{
/// <summary>
/// Converts <paramref name="entity"/> from <see cref="TInput"/> to <see cref="TOutput"/>
/// </summary>
/// <param name="entity">the object to convert</param>
/// <returns>The object converted</returns>
public static TOutput Convert(TInput entity)
{
if(entity is Enum)
throw new NotImplementedException("Entity is an enumeration - Use ConvertNum!");
TOutput output = new TOutput();
Type fromType = entity.GetType();
Type toType = output.GetType();
PropertyInfo[] props = fromType.GetProperties();
foreach (PropertyInfo prop in props)
{
PropertyInfo outputProp = toType.GetProperty(prop.Name);
if (outputProp != null && outputProp.CanWrite)
{
string propertyTypeFullName = prop.PropertyType.FullName;
object value = prop.GetValue(entity, null);
outputProp.SetValue(output, value, null);
}
}
return output;
}
}
答案 2 :(得分:3)
由于类通过继承彼此无关,因此不能将它们相互转换。
如果B
继承自A
,您就可以这样做 - 然后它会自动获取A
上定义的属性。
关于你的例子:
A.P1 = B.P1
A.P2 = B.P2
B.P1 = A.P1
B.P2 = A.P2
由于所有P1
和P2
成员的类型都是int
,因此您可以随时进行此类分配,因为这些属性是公开的,并且具有公共getter和setter。不需要铸造。
答案 3 :(得分:1)
为什么你想要这样的东西?如果两个类彼此相关,您可能希望继承它们:
public class A
{
public int P1 {set; get;}
public int P2 {set; get;}
}
public class B : A
{
public int P3 {set; get;}
public int P4 {set; get;}
}