Переопределить метод ToString () поля класса - PullRequest
3 голосов
/ 02 декабря 2011

Мне интересно, есть ли способ переопределить 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 ]

5 голосов
/ 02 декабря 2011

Нет, вы не можете переопределить или заменить реализацию 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();
3 голосов
/ 02 декабря 2011

Это зависит от контекста! Если в данном контексте используется контекст «чтобы что-то значимое включить в 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);
        }
    }
1 голос
/ 02 декабря 2011

Как отметил @DanielHigarth, нет действительно хорошего способа сделать это, и я не уверен, почему вы хотите ...

Но вы могли бы:

Используйте такой инструмент, как postsharp, чтобы перехватывать все вызовы byte[].ToString() из вашей сборки и возвращать все, что вам нравится, вместо фактического результата.

Используйте метод расширения, например,

public static string ToElegantString(this byte[] bytes) {
{
  return "ElegantString";
}
0 голосов
/ 07 февраля 2016

Определите ваш байтовый массив как отдельный класс, чтобы вы могли дать ему переопределение ToString ().

0 голосов
/ 02 декабря 2011

Как насчет того, чтобы вместо переопределения метода .ToString () просто изменить функцию get?

например:

public string Content
{
    get
    {
        return YourByteFormatter(_content);
    }       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...