我讨厌有一堆“左/右”的方法。每次添加或删除一个属性时,我都必须修复每种方法。代码本身看起来......错了。如何使用反射来简化构造函数和比较?
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);
}
}
我可能只是试图迫使范式我从Lua了解到在C#中,但这个特殊的例子似乎并不嫌臭给我。从这里开始,我开始做一些对田地秩序敏感的更复杂的事情。例如,而不是具有实质上等同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"),
};
所以现在我有我想要的iterability,但我还是有堆栈的代码镜像我感兴趣的每个属性(我也为CompareTo执行此操作,使用不同顺序的一组不同的属性)。更糟糕的是,这是失去了强大的打字。这真的开始闻起来。
那么在每个属性上使用属性来定义顺序呢?我开始走下这条路,事实上它运行良好,但它使整个事情看起来臃肿。它在语义上效果很好,但我总是谨慎使用高级功能,因为它们“整洁”。以这种方式使用反射矫枉过正?是否有其他解决方案来解决我缺少的左/右代码问题?
i'dd添加语言的标签,以获得更多的观众 – Toad 2009-08-27 14:07:13
记住,反思总是在C#中的性能问题。你多长时间一次操作Foos?混合解决方案可以使用Reflection.Emit,并缓存结果代码 - 启动速度较慢,执行速度较快。 – zildjohn01 2009-08-27 14:21:40
C#4.0带有内置的编译器,可以帮助生成代码并使用它,现在我们也有类似的问题,但是我们使用XML Class结构设计了解决方案,并且我们使用自己的代码生成方法来构建类生成很多依赖于成员名称的其他方法,它基本上是一个ORML,但是一切都是自动的。 – 2009-08-27 15:01:08