2012-06-26 5 views
2
[Serializable] 
public class SampleBase 
{ 
    [HumanReadableAttribute("The Base")] 
    public string BaseProp { get; set; } // "testing things" 
    public bool AllUrBase { get; set; } // true 

    public string AsHumanReadable() 
    { 
     var type = GetType(); 
     var properties = type.GetProperties(); 
     var stringRepresentation = new List<string>(); 
     foreach (var p in properties) 
     { 
      var ca = p.GetCustomAttributes(true).FirstOrDefault(a => a is HumanReadableAttribute); 
      var v = p.GetValue(this, null); 
      var t = v.GetType(); 
      var e = t.IsEnum ? t.GetField(Enum.GetName(t, v)).GetCustomAttributes(typeof(HumanReadableAttribute), false).FirstOrDefault() as HumanReadableAttribute : null; 
      stringRepresentation.Add(string.Format("{0}: {1}", ca ?? p.Name, v is bool ? ((bool) v ? "Yes" : "No") : e ?? v)); 
     } 
     return string.Join("\r\n", stringRepresentation); 
    } 
} 

[Serializable] 
public class SampleClass { 
    public enum MyEnum { 
     [HumanReadableAttribute("It makes sense")] 
     MakesSense, 
     [HumanReadableAttribute("It's weird")] 
     Nonsense 
    } 
    [HumanReadableAttribute("What do you think about this")] 
    public MyEnum MyProperty { get; set; } // Nonsense 
} 

Вызов метода AsHumanReadable будет производитьОтображение содержимого объекта

The Base: testing things 
AllUrBase: Yes 
What do you think about this: It's weird 

Мои пользователи могут добавлять SampleClass объекты (или широкий спектр других объектов, реализующих SampleBase) к корзине, которая будет храниться в течение позже использование. Сотрудник по обслуживанию клиентов будет читать результаты для проверки вещей.

Я думал о создании методов ToString (например, return "The Base" + BaseProp;). Моя мысль о том, что подход атрибута является более гибким.

Каковы преимущества и недостатки этих двух подходов (техническое обслуживание, локализация (если возможно, во избежание магии) и т. Д.)?

+1

Я не понимаю цели здесь. Почему вы украшаете свои классы (и заставляете потребителей вашего класса делать это), а не, скажем, делать простые записи? –

+0

Цель состоит в том, чтобы сделать его понятным для человека. Это и поддержка локализации. Но украшение, вероятно, избыточно в этом случае. См. Мой комментарий к ответу куна. Я не думаю, что журналирование решит проблему для меня. – Heki

ответ

3

Я рекомендую отказаться от пользовательской реализации и взглянуть на ServiceStack.Text, в частности на методы T.Dump.

Это уже реализовано и надежно. Единственное, что он не охватывает, это дружественные булевские строки (Да/Нет) /.

Индивидуальная реализация предполагает сначала создание хорошего и рабочего решения, которое требует времени, а затем обслуживания и добавления поддержки нового материала, что также требует времени. Есть много способов, которыми вы можете это сделать, с атрибутами, являющимися одним из них, но это просто не стоит, когда у вас есть ServiceStack.

В конечном счете, вы можете изменить методы T.Dump и настроить их в соответствии с вашими требованиями. Это все еще что-то не с нуля.

+0

Это выглядит довольно многообещающим, что ServiceStack! Мне часто нужно было что-то подобное. Он (и комментарий Вонко к моему вопросу) заставлял меня думать. Если я хочу локализовать имена свойств, почему бы просто не использовать их в качестве ключей, а не тратить время на оформление. Вернее, комбинация имени класса и имени свойства для ключа. – Heki