none
如何在C#.Net中自定义数据类型?使用方式和C#内部提供类型如string、decimal一样啊? RRS feed

  • 问题

  • 如何在C#.Net中自定义数据类型?
    我需要实现这样的操作,如自定义数据类型名称为FixedString用法同String;FixedString cc = "0123456789";其中FixedString的内容符合自定义的格式,如固定程度为10个字符等;但cc.GetType().FullName="FixedString";使用方式类似string、int变量;如:object obj=cc;string str=cc.ToString();
    抑或定义XmlString,其格式为Xml格式的内容等规则,但其GetType().FullName="XmlString";及Currency数据格式等。
    • 已编辑 lxchutao 2010年6月12日 6:02
    2010年6月9日 5:03

全部回复

  • 可以定义struct 在实现operator: struct FixString { private string _selfvalue; public FixString(string str) { _selfvalue = str; } public static implicit operator FixString(string value) { return new FixString(value); } public static implicit operator string(FixString fix) { return fix._selfvalue; } }
    2010年6月9日 7:17
  • 当然class也可以!
    2010年6月9日 7:37
  • 谢谢您的热心回复!很有帮助!
    不过还有问题,自定义数据类型用法在许多情况下还是不能同string一样,如在类型转换时就很麻烦,如这里FixString和string相互转换!
    但是C#中的如int、decimal、string等,在值允许的情况下是可以相互转换的,请问自定义数据类型值如何相互转换啊?
    请高手再帮帮忙,谢谢啦!
    详细如下所示:

        class Program
        {
            static void Main(string[] args)
            {
                Test test = new Test();
                string x0 = "0123456789";
                object obj0 = x0;
                //FixString fstr0 = obj0;//错误 CS0266: 无法将类型“object”隐式转换为“FixString
                //编译能通过,但执行时依然报错 Message="指定的转换无效。"
                FixString fstr0 = (FixString)obj0;

                //Message="从“System.String”到“FixString”的强制转换无效。"
                //然而其它类型,如int、decimal、string等就没有问题
                //问题:对自定义的数据类型该如何做,这样转换才能成功呢?
                object obj1 = Convert.ChangeType(x0, Type.GetType("FixString"));//执行时抛出异常

                Type type1 = test.GetType();
                FieldInfo myinfo = type1.GetField("_str", BindingFlags.NonPublic | BindingFlags.Instance);
                //Message="从“System.String”到“FixString”的强制转换无效。"
                //但是如果Test下的公共变量Str和私有变量_str类型是系统定义的类型string,转换就没有问题
                //自定义数据类型用法怎样才能同string一样呢?
                //问题:即对自定义的数据类型该如何做,这样转换才能成功呢?
                myinfo.SetValue(test, Convert.ChangeType(x0, Type.GetType(myinfo.FieldType.FullName)));
            }
        }

    /// <summary>
    /// 自定义数据类型:固定长度=10的字符串
    /// </summary>
    struct FixString
    {
        private string _selfvalue;

        public FixString(string str)
        {//添加内容的自定义格式处理
            if (str == null) _selfvalue = "          ";
            else if (str.Length < 10) _selfvalue = str.PadRight(10, ' ');
            else if (str.Length > 10) _selfvalue = str.Substring(0, 10);
            else _selfvalue = str;
        }
        public static implicit operator FixString(string value)
        {
            return new FixString(value);
        }
        public static implicit operator string(FixString fix)
        {
            return fix._selfvalue;
        }
        public override string ToString()
        {
            return _selfvalue;
        }
    }

    class Test
    {
        private FixString _str = "";
        public FixString Str
        {
            get { return _str; }
            set { _str = value; }
        }
    }

     

    2010年6月11日 5:24
  • 请高手再帮帮忙啊?谢谢了啊
    2010年6月11日 9:51