C#中,类名不一样,但类成员完全一样,可以相互转化吗?

 我来答
百度网友1c6e06f
推荐于2018-05-04 · TA获得超过2894个赞
知道小有建树答主
回答量:695
采纳率:66%
帮助的人:649万
展开全部

如果两个类里不重写强制转换操作符(比如在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;
    }
}

黄工的控件库
2014-02-28 · TA获得超过5732个赞
知道小有建树答主
回答量:1644
采纳率:50%
帮助的人:509万
展开全部
不可以的 除非是有继承关系
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友7116a85
2014-02-28
知道答主
回答量:6
采纳率:0%
帮助的人:8.5万
展开全部
可以使用一个第三方工具。叫AutoMapper用来进行转换
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式