Я ненавижу иметь кучу "левых / правых" методов. Каждый раз, когда свойство добавляется или удаляется, я должен исправить каждый метод. И сам код выглядит просто ... неправильно.
public Foo(Foo other)
{
this.Bar = other.Bar;
this.Baz = other.Baz;
this.Lur = other.Lur;
this.Qux = other.Qux;
this.Xyzzy= other.Xyzzy;
}
На самом деле это просто развернутый цикл, который перебирает свойства, копируя их между объектами. Так почему бы не быть честным по этому поводу? Отражение на помощь!
public Foo(IFoo other)
{
foreach (var property in typeof(IFoo).GetProperties())
{
property.SetValue(this, property.GetValue(other, null), null);
}
}
Возможно, я просто пытаюсь навязать C # парадигму, которую я выучил от Lua, но этот конкретный пример не кажется мне слишком вонючим. Отсюда я начал делать более сложные вещи, которые были чувствительны к порядку полей. Например, вместо того, чтобы иметь стек практически идентичных if
операторов для составления строки из полей, я просто перебираю их в нужном порядке:
public override string ToString()
{
var toJoin = new List<string>();
foreach (var property in tostringFields)
{
object value = property.GetValue(this, null);
if (value != null)
toJoin.Add(value.ToString());
}
return string.Join(" ", toJoin.ToArray());
}
private static readonly PropertyInfo[] tostringFields =
{
typeof(IFoo).GetProperty("Bar"),
typeof(IFoo).GetProperty("Baz"),
typeof(IFoo).GetProperty("Lur"),
typeof(IFoo).GetProperty("Qux"),
typeof(IFoo).GetProperty("Xyzzy"),
};
Так что теперь у меня есть итерация, которую я хотел, но у меня все еще есть стеки кода, отражающие каждое свойство, которое меня интересует (я также делаю это для CompareTo, используя другой набор свойств в другом порядке). Хуже, чем потеря строгой типизации. Это действительно начинает пахнуть.
Хорошо, а как насчет использования атрибутов в каждом свойстве для определения порядка? Я начал идти по этому пути, и он действительно работал хорошо, но все это выглядело раздутым. Он отлично работает семантически, но я всегда опасаюсь использовать расширенные функции только потому, что они «аккуратны». Является ли использование отражения таким способом излишним? Есть ли какое-то другое решение проблемы левого / правого кода, которое мне не хватает?