c#程序设计中怎么自定义显示或隐示转换

c#程序设计中怎么自定义显示或隐示转换,让类赋值时,可以直接复制不用转换


namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
        }
        public void IO()
        {
            //正常
            pr pr = new pr();
            pr2 pr2 = new pr2();
          pr2 pr21=  pr;
          //写上我们的显示转换后 就不会报错了

        }
    }
    public class pr
    {
        public int MyProperty { get; set; }
        public static implicit operator pr2(pr pr)//implicit 显示转化
        {
            pr2 pr2 = new pr2();
            pr2.MyProperty = pr.MyProperty;
            return pr2;
        }
        //强制转换
        //public static explicit   operator pr(pr2 pr)//implicit 显示转化
        //{
        //    pr pr2 = new pr();
        //    pr2.MyProperty = pr.MyProperty;
        //    return pr2;
        //}
    }
   public class pr2
    {
        public int MyProperty { get; set; }
    }
}

以下答案引用自GPT-3大模型,请合理使用:

一、自定义显示或隐藏转换

1. 实现IConvertible接口,重写转换函数。

2. 将要转换的对象定义为具体类型,如定义一个名为MyData的类,如下:

public class MyData : IConvertible
{
     //实现转换函数
     public TypeCode GetTypeCode() 
     {
        return TypeCode.Object; 
     }
    public bool ToBoolean(IFormatProvider provider) 
    {
        return false;
    }
    public byte ToByte(IFormatProvider provider) 
    {
        return 0;
    }
    public char ToChar(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public DateTime ToDateTime(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public decimal ToDecimal(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public double ToDouble(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public short ToInt16(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public int ToInt32(IFormatProvider provider) 
    { 
       return 123;
    }
    public long ToInt64(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public object ToType(Type conversionType, IFormatProvider provider) 
    {
        return Convert.ChangeType(this.ToString(), conversionType); 
    }
    public sbyte ToSByte(IFormatProvider provider) 
    {
        throw new InvalidCastException(); 
    }
    public float ToSingle(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public string ToString(IFormatProvider provider) 
    {
        return "Hello World";
    }
    public ushort ToUInt16(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public uint ToUInt32(IFormatProvider provider) 
    {
        throw new InvalidCastException();
    }
    public ulong ToUInt64(IFormatProvider provider) 
    { 
        throw new InvalidCastException();
    }
 }

3. 然后在使用时可以将其转换成指定类型,如int:

MyData data = new MyData();
int value = (int)data;
Console.WriteLine("value=" + value);

二、实现赋值时直接复制不用转换

1. 重写System.Object类的Equals()方法和GetHashCode()方法,实现对象的对比和HashCode的生成:

public override bool Equals (object obj)
{
    //进行类型判断并进行内容比较
    if (this.GetType () == obj.GetType())
    {
        MyData mData = (MyData)obj;
        //这里可以根据自定义的需求进行内容比较
        if (this.Name == mData.Name && this.Age == mData.Age)
            return true;
        else
            return false;
    }
    else
        return false;
}

public override int GetHashCode ()
{

如果我的回答解决了您的问题,请采纳我的回答