C#中,类名不一样,但类成员完全一样,可以相互转化吗?
3个回答
展开全部
如果两个类里不重写强制转换操作符(比如在A类里要写一个public static explicit A( B b ){ }方法,就可以实现B到A的显式转换,反之一样),肯定不能直接转的,但你既然说类成员完全一样,就可以利用反射技术来进行转换,写一个转换方法就可以通用了,以下是测试代码和结果:
// 定义两个具有完全相同成员的类
class A
{
public String S = "A";
public int Val = 1;
private double DVal = 10.1;
}
class B
{
public String S = "B";
public int Val = 2;
private double DVal = 20.1;
}
static class Program
{
[STAThread]
static void Main( params string[] args )
{
A a = new A();
B b = CopySameFieldsObject< B >( a ); // 把A的对象转换到B对象
B b2 = new B();
A a2 = CopySameFieldsObject< A >( b2 ); // 反过来测试下
}
// 假定输入类于与返回类具有完全相同的字段
static T CopySameFieldsObject< T >( Object source )
{
Type _SrcT = source.GetType();
Type _DestT = typeof( T );
// 构造一个要转换对象实例
Object _Instance = _DestT.InvokeMember( "", BindingFlags.CreateInstance, null, null, null );
// 这里指定搜索所有公开和非公开的字段
FieldInfo[] _SrcFields = _SrcT.GetFields( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
// 将源头对象的每个字段的值分别赋值到转换对象里,因为假定字段都一样,这里就不做容错处理了
foreach( FieldInfo field in _SrcFields )
{
_DestT.GetField( field.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).
SetValue( _Instance, field.GetValue( source ) );
}
return ( T )_Instance;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询