我討厭有一堆「左/右」的方法。每次添加或刪除一個屬性時,我都必須修復每種方法。代碼本身看起來......錯了。如何使用反射來簡化構造函數和比較?
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