覆盖类字段的ToString()方法

时间:2011-12-02 15:36:10

标签: c# .net oop class

我想知道,有没有办法覆盖类型为ToString()的类字段的byte[]方法?我甚至不确定它是否可能......以下是示例代码:

public class Object
{
    private byte[] _content;

    public byte[] Content
    {
        get
        {
            return _content;
        }

        internal set
        {
            _content = value;
        }
    }
}

是否可以覆盖调用Object.Content.ToString()方法的方式?

编辑:我为什么需要它?我想Content可能是纯二进制数据,但它也可以是纯字符串。如果我需要文字表示,我会使用Encoding.UT8.GetString(Object.Content),但是嘿!怎么样ToString()它完全符合我的目标,也许我能以某种方式使用它?

显而易见的方法是突然出现 - 在byte[]周围创建一个包装并覆盖其ToString()但这对我来说看起来很难看,我觉得不值得。

有没有优雅的方法来解决这个问题?或者解决它?

非常感谢提前!

5 个答案:

答案 0 :(得分:5)

不,您不能一般覆盖或替换字节数组ToString()的实现或具体的Content属性。为了得到你想要的结果,你可能需要包装你已经说过你不想做的数组。

您还可以在类中提供另一个属性,以有效地隐藏Content属性,例如

public string ContentAsString
{
    get 
    {
        return /* custom string output of this.Content here */
    }
}

另一个选择是扩展字节数组(通过扩展方法)以提供字符串转换的自定义实现(以及不同的名称)(与上面相同的想法,表达方式不同)

static class MyExtensions
{
    public static string ToCustomString(this byte[] array)
    {
        return ...
    }
}

string result = obj.Content.ToCustomString();

答案 1 :(得分:3)

这取决于具体情况!如果此处的上下文是“在PropertyGrid或DataGridView中显示有意义的内容”,那么您可以使用TypeConverter:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form {Controls = {
            new PropertyGrid {SelectedObject = new SomeType
            {
                Content = new byte[] {0,1,2,3,4,5}                                               
            }, Dock = DockStyle.Fill}
        }});
    }

    public class SomeType
    {
        private byte[] _content;
        [TypeConverter(typeof(HexConverter))]
        public byte[] Content
        {
            get
            {
                return _content;
            }

            internal set
            {
                _content = value;
            }
        }
    }
    class HexConverter : TypeConverter
    {
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if(destinationType == typeof(string))
            {
                if (value == null) return "";
                byte[] raw = (byte[]) value;
                var sb = new StringBuilder(2*raw.Length);
                for (int i = 0; i < raw.Length; i++) sb.Append(raw[i].ToString("x2"));
                return sb.ToString();
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }

答案 2 :(得分:1)

正如@DanielHigarth指出的那样,没有真正好的方法可以做到这一点,我不确定你为什么要...

但是,你可以:

使用postsharp等工具拦截程序集中对byte[].ToString()的所有调用,并返回您喜欢的内容而不是实际结果。

使用扩展方法,例如,

public static string ToElegantString(this byte[] bytes) {
{
  return "ElegantString";
}

答案 3 :(得分:0)

如何而不是覆盖.ToString()方法,只需修改get函数?

例如:

public string Content
{
    get
    {
        return YourByteFormatter(_content);
    }       
}

答案 4 :(得分:0)

将Byte数组定义为单独的Class,因此可以为其赋予ToString()覆盖。